C# UTF8编码字符串到字节[]的转换意外行为

C# UTF8编码字符串到字节[]的转换意外行为,c#,string,utf-8,bytearray,type-conversion,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 为什么?? 如何将字符串正确转换为字节[] 编辑:一个例子 public class Person {

我有一段代码:

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);
这是可能发生的

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

大小不同并不意味着转换无效。最初的顺序可能是这样的

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

展开编辑后:

new BinaryFormatter().Serialize(stream, p);
b1 = stream.ToArray();
str = UTF8Encoding.UTF8.GetString(b1);
b2 = UTF8Encoding.UTF8.GetBytes(str);
假设BinaryFormatter将对字符串应用UTF8编码。 可能没有。它将向流中添加额外的数据标记和大小字段

因此,您的2转换序列化和GetString不兼容

除了大小不同之外,当显示结果时,它可能会包含一些“奇怪”字符

第二次编辑:
当我反序列化新的字节数组b2时,它抛出一个异常

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

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

这是可能发生的

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

大小不同并不意味着转换无效。最初的顺序可能是这样的

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

展开编辑后:

new BinaryFormatter().Serialize(stream, p);
b1 = stream.ToArray();
str = UTF8Encoding.UTF8.GetString(b1);
b2 = UTF8Encoding.UTF8.GetBytes(str);
假设BinaryFormatter将对字符串应用UTF8编码。 可能没有。它将向流中添加额外的数据标记和大小字段

因此,您的2转换序列化和GetString不兼容

除了大小不同之外,当显示结果时,它可能会包含一些“奇怪”字符

第二次编辑:
当我反序列化新的字节数组b2时,它抛出一个异常

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


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

如果要将任意字节[]与字符串序列化,请不要使用UTF8编码。如果要将任意字节[]与字符串序列化,请不要使用UTF8编码,使用。

不要尝试使用UTF8.GetStrings或任何编码将二进制数据转换为字符串。请改用Convert.ToBase64String和Convert.FromBase64String

不要尝试使用UTF8.GetStringor或任何编码将二进制数据转换为字符串。改用Convert.ToBase64String和Convert.FromBase64String

,原始181字节是否为有效的UTF8序列?这里涉及到一个语法和一组规则。最初的181字节是有效的UTF8序列吗?这里涉及一个语法和一组规则。当我反序列化新字节数组b2时,它会抛出一个异常,因此我必须正确转换源字符串。当我反序列化新字节数组b2时,它抛出一个异常,因此,我必须正确转换源字符串。@尼克如果您的字节不是有效的UTF8序列,可能会导致您看到的奇怪行为。并非每个字节都必须具有有效的字符串表示形式。有关base64编码,请参阅。@Nick如果您的字节不是有效的UTF8序列,则可能会导致您看到的奇怪行为。并非每个字节都必须具有有效的字符串表示形式。有关base64编码,请参阅。