从字节数组转换为 base64 并返回

Posted

技术标签:

【中文标题】从字节数组转换为 base64 并返回【英文标题】:Conversion from byte array to base64 and back 【发布时间】:2022-01-12 11:59:18 【问题描述】:

我正在尝试:

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

我尝试了一些解决方案,例如 question 中的解决方案。

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

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);
    

我的问题是:

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

    是否可以来回转换,如果可以,我该如何实现?

【问题讨论】:

【参考方案1】:

编码数组长约四分之一的原因是 base-64 编码仅使用每个字节中的 6 位;这就是它存在的原因 - 以适合通过仅 ASCII 渠道(例如电子邮件)进行交换的方式对任意数据(可能使用零和其他不可打印字符)进行编码。

获取原始数组的方法是使用Convert.FromBase64String

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

【讨论】:

那行得通,虽然如果 base64 只使用每 8 位中的 6 位,我会认为编码会更短? @crawfish 编码在输出中使用八位中的六位,将两个最高有效位设置为零。结果,每组三个字节(3*8=24 位)变成一组四个字节(4*6=24 位)。如果原始字节数不能被三整除,则在末尾添加特殊标记。在您的情况下,下一个可被 3 整除且大于 32 的数字是 33,或 11*3。这意味着结果是11*4,即44字节长。 组三个字节(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 假设 MSB(最左位或大端)填充(对于 LSB 小端,b 将位于右端)。

以上是关于从字节数组转换为 base64 并返回的主要内容,如果未能解决你的问题,请参考以下文章

将base64字节数组转换为图像

如何将图像的字节数组转换为表示 jpg 的 base64 编码字符串

在 C# 中将 Base64 字节数组解码为图像

如何在 JavaScript 中使用字节数组将字符串转换为 base64 编码?

将文件转换为字节值数字数组

如何在 ios 中将 Base64 编码的 NSString 转换为字节数组(Java)?