c#Convert.To/FromBase64String混乱

时间:2014-08-21 21:55:05

标签: c# base64 binary-data data-conversion

假设我有这个方法。

private static void Example(string data)
    {
        Console.WriteLine("Initial : {0}", data);

        data = data.PadRight(data.Length + 1, '0'); 
        Console.WriteLine("Step 1 : {0}", data);

        data = data.PadRight(data.Length + 4 - data.Length % 4, '=');
        Console.WriteLine("Step 2 : {0}", data);

        byte[] byteArray = Convert.FromBase64String(data);
        string newData = Convert.ToBase64String(byteArray);
            Console.WriteLine("Step 3 : {0}", newData);
    }

我希望输出字符串“1”的输出如下

Initial : 1
Step 1 : 10
Step 2 : 10==
Step 3 : 10==

相反,输出就是这个。

Initial : 1
Step 1 : 10
Step 2 : 10==
Step 3 : 1w==

我不知道为什么。我希望输出与输入相同,但事实并非如此。 我试过替换

data = data.PadRight(data.Length + 1, '0'); 

data = data + "0";

它也会出现更长的输入字符串,例如长度为5或9的字符串。如果我添加“=”但是我超过我的填充限制Convert.FromBase64String()

所以我的问题是真的发生了什么,我怎样才能获得预期的输出? 什么是 我做错了

编辑:对于那些为什么我使用bas64感到困惑的人,它与此PHP decrypting data with RSA Private Key

有关

1 个答案:

答案 0 :(得分:3)

基本上,没有字节数组可以编码10==

如果base64字符串以==结尾,则表示最后4个字符仅表示单个字节。因此,只有第一个字符和第二个字符的前2位是相关的。查看Wikipedia表,10表示以下值:

'1' = 53  '0' = 52
110101    110100

因此,编码1101 0111的字节,然后忽略最后的四位(0100)。当您重新编码数据时,它会使用0代替最后的四位,给出:

'1' = 53  'w' = 48
110101    110000

从根本上说,它并不清楚你要做的是什么 - 但如果你的输入是base64编码值的 part ,那就太奇怪了。代码表现得像我期望的那样 - 它只是有用的代码......