我有这段代码:
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);
答案 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次转化(Serialize
和GetString
)不兼容。
除了大小差异外,当您显示结果时,它可能包含一些“奇怪”字符。
当我反序列化新的字节数组(b2)时,它会产生异常
右。您实际需要的是Convert.ToBase64String()
,而不是UTF8.GetString()
Base64字符串可以作为字符串存储和传输,然后再次转换回byte[]
。
答案 1 :(得分:1)
如果要将任意byte[]
序列化为字符串,请不要使用UTF8编码,请使用Base64。
答案 2 :(得分:1)
请勿尝试将二进制数据转换为UTF8.GetString
(或任何编码)字符串。请改用Convert.ToBase64String
和Convert.FromBase64String