【问题标题】:C# BinaryReader.Read() gets junk to start withC# BinaryReader.Read() 开始变得垃圾
【发布时间】:2011-05-14 19:44:05
【问题描述】:

我想弄清楚我在这里做错了什么。我正在尝试使用二进制读取器来轻松地将流中的初始四个字节转换为 Int32 值,该值告诉我剩余数据的预期时间。

static void Main(string[] args)
{
    MemoryStream stream = new MemoryStream();

    BinaryWriter writer = new BinaryWriter(stream);

    string s = "Imagine this is a very very long string.";

    writer.Write(s.Length);
    writer.Write(s);
    writer.Flush();

    BinaryReader reader = new BinaryReader(stream);
    reader.BaseStream.Seek(0, SeekOrigin.Begin);

    char[] aChars = new char[reader.ReadInt32()];
    reader.Read(aChars, 0, aChars.Length);
    Console.WriteLine(new string(aChars));
}

输出应该是输入,但我明白了(注意第一个字符从字符串变为字符串)

(想象这是一个非常长的字符串

有人可以向我解释我做错了什么吗?理想情况下,第二次读取将继续,直到总读取字节数等于前四个字节的值。这段代码只是为了显示我遇到的问题的简化。流的位置似乎是正确的 (4),但它几乎似乎从 2 开始读取。

【问题讨论】:

  • 呵呵,谢谢...我是。对我来说不幸的是,BinaryReader 没有提到 Writer 为字符串存储额外的数据而不是字符串;)
  • BinaryWriter.Write(string): "以长度为前缀的string 表示string 的长度,在string 前面加上一个包含string 长度的单个字节或单词。此方法首先将string 的长度写入为UTF-7 编码的无符号整数,然后使用BinaryWriter 实例的当前编码将那么多字符写入流。"
  • BinaryReader.ReadString: "从当前流中读取stringstring 以长度为前缀,编码为整数,一次七位。"

标签: c# memorystream binaryreader


【解决方案1】:

BinaryWriter.Write(String) 将长度前缀字符串写入此流。 这意味着它首先将字符串的长度写入流,然后使用某种编码将字符串写入。长度一次编码为 7 位,而不是 32 位整数。

如果你想从流中读取,你应该使用BinaryReader.ReadString,它从流中读取一个以长度为前缀的字符串。

【讨论】:

  • 如果流中最初没有数据,它会自动等待其余数据显示出来吗?
  • 不仅是先写长度,而且长度是用7位编码写的。因此,长度小于 128 字节的字符串具有一字节长度前缀等。
  • @James:是的,它会等待数据。
  • @James:是的,ReadString 返回整个字符串,而不仅仅是其中的一部分。但它不会“等待”任何事情。它只是从流中读取组成字符串的长度和字节。如果字节数少于长度前缀,则会抛出异常。
  • [facepalm] 谢谢大家。。我已经阅读了几个小时的所有“阅读器”文档,试图找出额外数据的来源以及让我追鬼的写入过程!我会在几分钟内将其标记为答案..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 2010-11-22
  • 2011-11-29
相关资源
最近更新 更多