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



我有这个代码:

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

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

编辑:示例

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

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

因此,您的2个转换(SerializeGetString)不兼容。

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


第二次编辑:

当我对新字节阵列(B2)进行应对时,它会趋于异常

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

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

如果要序列化任意 byte[] for and string,请勿使用UTF8编码,请使用base64。

不要尝试使用UTF8.GetString(或任何编码)将 binary 数据转换为字符串。使用Convert.ToBase64StringConvert.FromBase64String

最新更新