从字节数组到Base64的转换以及反向转换

53

我正在尝试:

  1. 生成一个字节数组。
  2. 将该字节数组转换为base64字符串。
  3. 将该base64字符串转换回字节数组。

我尝试了一些解决方案,例如在这个问题中的解决方案。

出于某种原因,初始和最终的字节数组不匹配。以下是使用的代码:

using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
    {
         byte[] originalArray = new byte[32];
         rng.GetBytes(key);
         string temp_inBase64 = Convert.ToBase64String(originalArray);
         byte[] temp_backToBytes = Encoding.UTF8.GetBytes(temp_inBase64);
    }

我的问题是:

  1. 为什么"originalArray"和"temp_backToBytes"不匹配?(originalArray长度为32,temp_backToBytes长度为44,但它们的值也不同)

  2. 是否可以相互转换,如果可以,我该如何实现?

1个回答

68

编码后的数组长度增加约四分之一的原因是,base-64编码每个字节只使用了六位;这是它存在的原因 - 以一种适合通过仅支持ASCII的通道(例如电子邮件)交换任意数据,可能包含零和其他不可打印字符的方式进行编码。

要获取原始数组,可以使用Convert.FromBase64String

 byte[] temp_backToBytes = Convert.FromBase64String(temp_inBase64);

虽然这个方法可行,但如果 base64 只使用了每 8 位中的 6 位,我认为编码会更短? - crawfish
7
该编码使用了输出中的八位中的六位,剩下的两位最高有效位被设为零。因此,每组三个字节(38=24位)变成了一组四个字节(46=24位)。如果原始字节数不是3的倍数,则在末尾添加特殊标记。在你的情况下,大于32且可被3整除的下一个数字是33,即11*3。这意味着结果长度为11*4,即44个字节。 - Sergey Kalinichenko
三个字节(3*8=24位)变成32位。即 1 2 3 4 5 6 7 8 | 1 2 3 4 5 6 7 8 | 1 2 3 4 5 6 7 8 => b b 1 2 3 4 5 6 | b b 7 8 1 2 3 4 | b b 5 6 7 8 1 2 | b b 3 4 5 6 7 8,假设最高有效位(左侧最高位或大端)填充(对于最低有效位小端,b将在右侧)。 - samus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接