字节数组转base64字符串
Byte arrays to base64 string
假设我有两个字节数组。
在第一种情况下,我连接两个数组(使用 Buffer.BlockCopy),然后将结果转换为 base64 字符串。
在第二种情况下,我将每个字节数组转换为 base64 字符串,然后连接这些字符串。
这两个结果会一样吗?
如果第一个数组的长度可以被 3 整除,结果将是相同的,在所有其他情况下,由于第一个字符串末尾的填充字节,两个 base64 字符串的连接结果将不同(并且 base64 无效) .第二个数组的长度对于此操作无关紧要,因为填充总是在末尾。
为什么要“被 3 整除”- 因为 base64 将每 3 个字节编码为恰好 4 个字符的这种长度的数组将不需要在末尾填充。请参阅 https://www.rfc-editor.org/rfc/rfc4648#section-4 for formal details and https://en.wikipedia.org/wiki/Base64#Padding 以获得更易读的解释。
即如果第一个数组的长度为 4 个字节,则在转换后的字符串末尾会得到 ==
,并且与其他 base64 字符串的连接将导致无效的 base64 文本
Convert.ToBase64String(new byte[]{1,2,3,4}) // AQIDBA==
先连接数组或连接字符串的示例情况:
Convert.ToBase64String(new byte[]{1,2,3}) + // length divisible by 3
Convert.ToBase64String(new byte[]{4,5})
==
Convert.ToBase64String(new byte[]{1,2,3,4,5}) // AQIDBAU=
void Main()
{
byte[] bytes1 = new byte[]{10, 20, 30, 40, 0, 0, 0, 0};
byte[] bytes2 = new byte[]{50, 60, 70, 80};
Buffer.BlockCopy(bytes2, 0, bytes1, 4, 4);
PrintByteArray(bytes1);
string bytesStr = Convert.ToBase64String(bytes1);
Console.WriteLine(bytesStr);
string bytesStr1 = Convert.ToBase64String(bytes1);
string bytesStr2 = Convert.ToBase64String(bytes2);
string bytesStrMerged = bytesStr1 + bytesStr2;
Console.WriteLine(bytesStrMerged);
}
public void PrintByteArray(byte[] bytes)
{
var sb = new StringBuilder();
foreach (var b in bytes)
{
sb.Append(b + " ");
}
Console.WriteLine(sb.ToString());
}
输出:
10 20 30 40 50 60 70 80
ChQeKDI8RlA=
ChQeKDI8RlA=MjxGUA==
假设我有两个字节数组。
在第一种情况下,我连接两个数组(使用 Buffer.BlockCopy),然后将结果转换为 base64 字符串。
在第二种情况下,我将每个字节数组转换为 base64 字符串,然后连接这些字符串。
这两个结果会一样吗?
如果第一个数组的长度可以被 3 整除,结果将是相同的,在所有其他情况下,由于第一个字符串末尾的填充字节,两个 base64 字符串的连接结果将不同(并且 base64 无效) .第二个数组的长度对于此操作无关紧要,因为填充总是在末尾。
为什么要“被 3 整除”- 因为 base64 将每 3 个字节编码为恰好 4 个字符的这种长度的数组将不需要在末尾填充。请参阅 https://www.rfc-editor.org/rfc/rfc4648#section-4 for formal details and https://en.wikipedia.org/wiki/Base64#Padding 以获得更易读的解释。
即如果第一个数组的长度为 4 个字节,则在转换后的字符串末尾会得到 ==
,并且与其他 base64 字符串的连接将导致无效的 base64 文本
Convert.ToBase64String(new byte[]{1,2,3,4}) // AQIDBA==
先连接数组或连接字符串的示例情况:
Convert.ToBase64String(new byte[]{1,2,3}) + // length divisible by 3
Convert.ToBase64String(new byte[]{4,5})
==
Convert.ToBase64String(new byte[]{1,2,3,4,5}) // AQIDBAU=
void Main()
{
byte[] bytes1 = new byte[]{10, 20, 30, 40, 0, 0, 0, 0};
byte[] bytes2 = new byte[]{50, 60, 70, 80};
Buffer.BlockCopy(bytes2, 0, bytes1, 4, 4);
PrintByteArray(bytes1);
string bytesStr = Convert.ToBase64String(bytes1);
Console.WriteLine(bytesStr);
string bytesStr1 = Convert.ToBase64String(bytes1);
string bytesStr2 = Convert.ToBase64String(bytes2);
string bytesStrMerged = bytesStr1 + bytesStr2;
Console.WriteLine(bytesStrMerged);
}
public void PrintByteArray(byte[] bytes)
{
var sb = new StringBuilder();
foreach (var b in bytes)
{
sb.Append(b + " ");
}
Console.WriteLine(sb.ToString());
}
输出:
10 20 30 40 50 60 70 80
ChQeKDI8RlA=
ChQeKDI8RlA=MjxGUA==