我正在开发一个解析器来接收 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 code 的 BinaryReader
。它使用一个名为 Read7BitEncodedInt() 的函数,在查找该文档和 Write7BitEncodedInt() 的文档后,我发现了这一点:
此外,Ralf 发现 this link 可以更好地显示正在发生的事情。
关于c# - BinaryReader ReadString 指定长度?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19710688/