字节数组为base64字符串

Ale*_*x K 1 c# arrays base64 byte

假设我有两个字节数组.

在第一个场景中,我连接两个数组(使用Buffer.BlockCopy),然后将结果转换为base64字符串.

在第二种情况下,我将每个字节数组转换为base64字符串,然后连接这些字符串.

这两个结果会一样吗?

Ale*_*kov 5

如果第一个数组的长度可以被3整除,结果将是相同的,在所有其他情况下,由于第一个字符串末尾的填充字节,两个base64字符串的串联结果将是不同的(并且无效的base64).第二个数组的长度对于此操作无关紧要,因为填充总是在末尾.

为什么"可以被3整除" - 因为base64将每3个字节编码成4个字符,这样长度的数组最后不需要填充.见https://tools.ietf.org/html/rfc4648#section-4正式细节和https://en.wikipedia.org/wiki/Base64#Padding为更具可读性的解释.

也就是说,如果第一个数组是4个字节长,你得到==的转换后的字符串和连接其他的base64字符串的结尾会导致无效的base64文本

Convert.ToBase64String(new byte[]{1,2,3,4}) // AQIDBA==
Run Code Online (Sandbox Code Playgroud)

连接首先在数组上或字符串上连接的示例情况:

 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=
Run Code Online (Sandbox Code Playgroud)