UTF8Encoding string to byte []转换意外行为

时间:2012-10-23 14:27:39

标签: c# string utf-8 bytearray type-conversion

我有这段代码:

byte[] bytes = ...

// Here my bytes.Lenght is 181 (for example)

var str = UTF8Encoding.UTF8.GetString(bytes);
bytes = UTF8Encoding.UTF8.GetBytes(str);

// Here my bytes.Lenght is 189

为什么?
如何将字符串正确转换为byte []?

编辑:一个例子

public class Person 
{
    public string Name { get; set; }
    public uint Age { get; set; }
}

...

Person p = new Person { Name = "Mary", Age = 24 };

string str;
byte[] b1, b2;

using (var stream = new MemoryStream())
{
    new BinaryFormatter().Serialize(stream, p);
    b1 = stream.ToArray();
    str = UTF8Encoding.UTF8.GetString(b1);
}

b2 = UTF8Encoding.UTF8.GetBytes(str);

3 个答案:

答案 0 :(得分:2)

// Here my bytes.Lenght is 181 (for example)    
// Here my bytes.Lenght is 189

这可能发生。

  

如何将字符串正确转换为byte[]

尺寸差异并不意味着转换无效。最初的序列可能已经过了。

如果要保留大小,请使用ASCII编码。


扩展编辑后:

new BinaryFormatter().Serialize(stream, p);
b1 = stream.ToArray();
str = UTF8Encoding.UTF8.GetString(b1);
b2 = UTF8Encoding.UTF8.GetBytes(str);

您假设BinaryFormatter将UTF8编码应用于字符串 它可能没有。它会向流中添加额外的数据(标记和大小字段)。

因此,您的2次转化(SerializeGetString)不兼容。

除了大小差异外,当您显示结果时,它可能包含一些“奇怪”字符。


第二次编辑:

  

当我反序列化新的字节数组(b2)时,它会产生异常

右。您实际需要的是Convert.ToBase64String(),而不是UTF8.GetString()

Base64字符串可以作为字符串存储和传输,然后再次转换回byte[]

答案 1 :(得分:1)

如果要将任意byte[]序列化为字符串,请不要使用UTF8编码,请使用Base64

答案 2 :(得分:1)

请勿尝试将二进制数据转换为UTF8.GetString(或任何编码)字符串。请改用Convert.ToBase64StringConvert.FromBase64String