字节数组为base64字符串

时间:2016-10-08 01:29:42

标签: c# arrays base64 byte

假设我有两个字节数组。

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

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

这两个结果会不一样?

2 个答案:

答案 0 :(得分: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==

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

 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=

答案 1 :(得分:1)

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==
相关问题