我有这个代码:
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个转换(Serialize
和GetString
)不兼容。
除了大小的差异外,当您显示结果时,它可能包含一些"奇怪"字符。
第二次编辑:
当我对新字节阵列(B2)进行应对时,它会趋于异常
对。您实际需要的是Convert.ToBase64String()
,而不是UTF8.GetString()
base64字符串可以作为字符串存储和运输,然后再次转换回byte[]
。
如果要序列化任意 byte[]
for and string,请勿使用UTF8编码,请使用base64。
不要尝试使用UTF8.GetString
(或任何编码)将 binary 数据转换为字符串。使用Convert.ToBase64String
和Convert.FromBase64String