代码之家  ›  专栏  ›  技术社区  ›  James

C 35; BinaryReader.Read()从垃圾开始

  •  6
  • James  · 技术社区  · 14 年前

    我想弄清楚我在这里做错了什么。我正试图使用二进制读取器来简化从一个流中获取初始4个字节到一个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开始读取。

    1 回复  |  直到 14 年前
        1
  •  8
  •   dtb    14 年前

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

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