C#BinaryReader.Read()首先获取垃圾

C#BinaryReader.Read()首先获取垃圾,c#,memorystream,binaryreader,C#,Memorystream,Binaryreader,我正在努力找出我做错了什么。我正在尝试使用二进制读取器来轻松地将流中的初始四个字节转换为Int32值,该值告诉我剩余数据的预期长度 static void Main(string[] args) { MemoryStream stream = new MemoryStream(); BinaryWriter writer = new BinaryWriter(stream); string s = "Imagine this is a very very long s

我正在努力找出我做错了什么。我正在尝试使用二进制读取器来轻松地将流中的初始四个字节转换为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开始读取。

将长度前缀字符串写入该流。 这意味着它首先将字符串的长度写入流,然后使用某种编码将字符串写入流。该长度一次编码七位,而不是32位整数


如果要从流中读取数据,应该使用,它会从流中读取长度前缀字符串。

如果流中没有初始数据,它会自动等待其余数据显示吗?它不仅会先写入长度,而且会以7位编码写入长度。因此,小于1的字符串28字节长的字符串有一个字节长的前缀,等等。@James:Yes,它将等待数据。@James:Yes,ReadString返回整个字符串,而不仅仅是其中的一部分。但它不会“等待”它只从流中读取长度和组成字符串的字节。如果长度前缀指示的字节数较少,它将抛出异常。[facepalm]谢谢大家。我已经阅读了所有的“阅读器”文档好几个小时了,现在我试图弄清楚额外的数据来自何处,以及让我一直在追踪鬼魂的写入过程!几分钟后我会将此标记为答案。呵呵,谢谢…我是。不幸的是,二进制阅读器没有提到写入程序存储的内容字符串的额外数据;)
BinaryWriter.Write(字符串)
:“以
字符串
为前缀的长度表示
字符串
的长度,方法是在
字符串
前加一个包含该
字符串
长度的字节或单词。此方法首先将
字符串的长度写入UTF-7编码的无符号整数,然后使用
BinaryWriter
实例的当前编码将这么多字符写入流。“
BinaryReader.ReadString
:”从当前流中读取
字符串。
字符串
以长度作为前缀,一次编码为七位整数。”