C#:为什么我只能将999个字符转换为1024个字节?

时间:2017-01-25 15:35:07

标签: c# string type-conversion byte

string longMessage = "";//The string to convert to bytes
for (int i = 0; i < 999; i++)//Adding 999 chars
{
    longMessage += "i";
}
byte[] buffer = new byte[1024];//Array of bytes to store the message
Stream stream = new MemoryStream(buffer);
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, longMessage);

为什么在字符串中放入超过999个字符时出现错误,而不是在1024个字符之后?我收到以下错误:

  

NotSupportedException:无法展开此MemoryStream

错误:如果没有这种类型的信息,它就不会知道它应该反序列化的实际类型。

2 个答案:

答案 0 :(得分:1)

因为BinaryFormatter除了实际数据外还会发出类型信息。这意味着还有其他字节表示您正在存储字符串。在您正在使用的.NET框架版本中(因为BinaryFormatter不可移植)显然这种类型信息占用25个字节。

如果没有这种类型的信息,它就不会知道它应该反序列化的实际类型。

所以基本上你可以让它占用二进制序列化所需的字节数:

using (MemoryStream stream = new MemoryStream())
{
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(stream, longMessage);
    byte[] actualData = stream.ToArray();
}

答案 1 :(得分:1)

字符串本身有一个编码 - 它不仅仅是一个1字节字符的数组。它包含有关该字符串以及如何读取它的其他信息(ASCII,Unicode,UTF等)。

您可以使用以下命令使用ASCII编码从输入字符串中获取1024字节数组:

string longMessage = "";//The string to convert to bytes
for (int i = 0; i < 1024; i++)//Adding 1024 chars
{
    longMessage += "i";
}
byte[] buffer = Encoding.ASCII.GetBytes(longMessage);
相关问题