1

我有这段代码:

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

3 回答 3

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 转换 ( Serializeand GetString) 只是不兼容。

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


第二次编辑:

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

正确的。你真正需要的是Convert.ToBase64String(),不是UTF8.GetString()

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

于 2012-10-23T14:32:25.777 回答
1

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

于 2012-10-23T14:36:18.330 回答
1

不要尝试使用(或任何编码)将二进制数据转换为字符串 。UTF8.GetString使用Convert.ToBase64Stringand Convert.FromBase64String代替

于 2012-10-23T14:37:22.850 回答