如何在C#(3.5框架)中编码和解码基于128的字符串

如何在C#(3.5框架)中编码和解码基于128的字符串,c#,.net,c#-4.0,base64,C#,.net,C# 4.0,Base64,我正在从事与安全相关的项目,在该项目中,我目前将数据转换为base64格式。但转换后的base64数据的大小更大,为此,我想将数据转换为base128格式。如何在c#中对base128字符串格式的数据进行编码和解码?如果可以避免的话,我强烈建议不要使用base128编码。7位字母表必须包含不可打印的ASCII控制字符(代码点0x20以下只有94个可打印字符)。如果您试图提供这种类型的数据,许多系统将崩溃。它似乎真的不值得为额外的一点节省少量的空间。类似或可能满足您的需求,而不会让您头痛。关于类似

我正在从事与安全相关的项目,在该项目中,我目前将数据转换为base64格式。但转换后的base64数据的大小更大,为此,我想将数据转换为base128格式。如何在c#中对base128字符串格式的数据进行编码和解码?

如果可以避免的话,我强烈建议不要使用base128编码。7位字母表必须包含不可打印的ASCII控制字符(代码点0x20以下只有94个可打印字符)。如果您试图提供这种类型的数据,许多系统将崩溃。它似乎真的不值得为额外的一点节省少量的空间。类似或可能满足您的需求,而不会让您头痛。关于类似的问题,请参阅本文

但是,如果您是持久的,那么您应该能够修改下面的映射字符串以获得所需的内容。 (注意:对于要添加到映射中的字符,必须使用正确的不可打印代码,如“\x09”):

公共静态字符串GetStringFromByteArray(字节[]数据)
{
字符串映射=“abcdefghijklmnopqrstuvwxyz012456789abcdefghijklmnopqrstuvqwxyz!#$%&()*+-?@^ `{124;}~,./:[]\\”;
BigInteger base10=新的BigInteger(数据);
字符串baseX;
int base=mapping.Length;
var result=新堆栈();
做
{
结果:Push(映射[(int)(以10%为基数)];
基数10/=基数;
}而(base10!=0);
baseX=新字符串(result.ToArray());
返回baseX;
}

如果可以避免的话,我强烈建议不要使用Base128编码。7位字母表必须包含不可打印的ASCII控制字符(代码点0x20以下只有94个可打印字符)。如果你试图提供这种类型的数据,许多系统都会崩溃。这似乎真的不值得为额外的部分节省少量空间。类似或可能满足你的需要,而不会让人头痛。请参阅这篇关于类似问题的帖子

但是,如果您是持久的,那么您应该能够修改下面的映射字符串以获得所需的内容。 (注意:对于要添加到映射中的字符,必须使用正确的不可打印代码,如“\x09”):

公共静态字符串GetStringFromByteArray(字节[]数据)
{
字符串映射=“abcdefghijklmnopqrstuvwxyz012456789abcdefghijklmnopqrstuvqwxyz!#$%&()*+-?@^ `{124;}~,./:[]\\”;
BigInteger base10=新的BigInteger(数据);
字符串baseX;
int base=mapping.Length;
var result=新堆栈();
做
{
结果:Push(映射[(int)(以10%为基数)];
基数10/=基数;
}而(base10!=0);
baseX=新字符串(result.ToArray());
返回baseX;
}

为什么尺寸更大?数据是整数还是ascii文本?我想你在找别的东西,而不是base128。@ericosg我有一个图像,我转换成base64格式,base64数据的大小是2.33KB。如果我们使用base128编码技术而不是base64编码技术,则大小将减小。请尝试yEnc,如果您使用base256,则大小将更小!Base64的全部思想是将二进制数据编码为可打印字符串。就像x2注释中的链接答案一样-当给定编码时,某些字符不可打印或不明确时,您希望如何将数据输出为字符串?为什么大小更大?数据是整数还是ascii文本?我想你在找别的东西,而不是base128。@ericosg我有一个图像,我转换成base64格式,base64数据的大小是2.33KB。如果我们使用base128编码技术而不是base64编码技术,则大小将减小。请尝试yEnc,如果您使用base256,则大小将更小!Base64的全部思想是将二进制数据编码为可打印字符串。就像x2评论中的链接答案一样-当某些字符在给定编码时不可打印或不含糊时,您希望如何将数据输出为字符串?Jhonson ok..但我正在使用.Net 3.5 framework,所以“BigInteger”在该框架中不可用,对吗?@PraveenKumar您的问题没有说您被限制为3.5。无论如何,BigInteger类只是使算法更容易理解。您可以使用数据的字节操作来仅提取每7位,将其用作映射字符串的索引。这将获得与在上述代码中使用BigInteger相同的效果。Jhonson ok..但我正在使用.Net 3.5框架,因此“BigInteger”在该框架中不可用,对吗?@PraveenKumar您的问题没有说您仅限于3.5。无论如何,BigInteger类只是使算法更容易理解。您可以使用数据的字节操作来仅提取每7位,将其用作映射字符串的索引。这将获得与在上述代码中使用BigInteger相同的效果。
public static string GetStringFromByteArray(byte[] data)
        {
            string mapping = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvqwxyz!#$%&()*+-;<=>?@^_`{|}~',./:[]\\\"";

            BigInteger base10 = new BigInteger(data);
            string baseX;
          int base=mapping.Length;
            var result = new Stack<char>();

            do
            {
                result.Push(mapping[(int)(base10 % base)]);
                base10 /= base;

            } while (base10 != 0);

            baseX = new string(result.ToArray());

            return baseX;
        }