我正在开发一个解析器来接收 UDP 信息,解析它并存储它。为此,我使用了 BinaryReader,因为它主要是二进制信息。不过,其中一些将是字符串。 MSDN says 用于 ReadString() 函数:



我完全理解它,直到“一次七位”我试图简单地忽略它,直到我开始测试。在将其放入 MemoryStream 并尝试使用 BinaryReader 读取它之前,我正在创建自己的字节数组。这是我最初认为可行的方法:

byte[] data = new byte[] { 3, 0, 0, 0, (byte)'C', (byte)'a', (byte)'t', }
BinaryReader reader = new BinaryReader(new MemoryStream(data));
String str = reader.ReadString();

知道 int 是 4 个字节(并且玩弄了足够长的时间以发现 BinaryReader 是 Little Endian)我将 3 的长度和相应的字母传递给它。然而 str 最终持有 \0\0\0 。如果我删除了 3 个零并且只有
byte[] data = new byte[] { 3, (byte)'C', (byte)'a', (byte)'t', }

然后它正确读取和存储 Cat。对我来说,这与说明长度应该是整数的文档相冲突。现在我开始认为它们只是一个没有小数位的数字,而不是数据类型 int 。这是否意味着 BinaryReader 永远不能读取大于 127 个字符的字符串(因为 01111111 对应于文档的 7 位部分)?

我正在编写一个协议(protocol),在将我们的文档传递给我们的客户之前,我需要完全了解我正在研究的内容。

最佳答案

我找到了 source codeBinaryReader 。它使用一个名为 Read7BitEncodedInt() 的函数,在查找该文档和 Write7BitEncodedInt() 的文档后,我发现了这一点:



此外,Ralf 发现 this link 可以更好地显示正在发生的事情。

关于c# - BinaryReader ReadString 指定长度?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19710688/

10-11 01:44