【问题标题】:C#: Why can I convert only 999 chars to 1024 bytes?C#:为什么我只能将 999 个字符转换为 1024 个字节?
【发布时间】:2017-01-25 15:35:07
【问题描述】:
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

错误:没有这种类型信息,它不会知道它应该反序列化回什么实际类型。

【问题讨论】:

  • 您是否忘记向我们提供实际的错误信息?我不想猜测发生了什么。
  • @rory.ap NotSupportedException: 无法展开此 MemoryStream
  • 请编辑您的实际问题以包含此信息。我不知道你为什么一开始就不包括在内……

标签: c# string type-conversion byte


【解决方案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);

【讨论】:

  • @Aviv 是的,UTF-16,就像 .NET、Java、JavaScript、XML、HTML 中的所有字符串一样。如果您希望以西方文字为主的文本更紧凑(代价是东方文字中的文本占用更多空间),请使用buffer = Encoding.UTF8.GetBytes(longMessage)。如果您想要无声的数据丢失,请继续使用 ASCII。在任何情况下,序列化和反序列化例程都必须使用相同的编码。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-03-02
    • 2015-03-25
    • 2019-07-27
    • 2015-07-01
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多