【发布时间】:2013-11-11 16:55:17
【问题描述】:
我正在开发一个解析器来接收 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 位部分)?
我正在编写一个协议,在将文档传递给我们的客户之前,我需要完全了解我所涉及的内容。
【问题讨论】:
-
BinaryReader 旨在读取使用 BinaryWriter 写出的内容。所以尝试用 BinaryWriter 写出不同长度的字符串,你应该能够弄清楚协议。
-
但是你最好弄清楚那个 UDP 协议是如何向你发送数据的,当它没有为字符串添加前缀时(这是最有可能的),这一切都是徒劳的。
-
我正在为我的工作定义协议,发送数据的代码很可能不会用 C#(可能是 Linux 上的 python 或 C)编写,因此无法访问 BinaryWriter。我正在使用 BinaryReader 来提高代码的可读性,尽管我可能会放弃
ReadString并使用固定的 4 字节作为长度并使用ReadChars以便更容易实现。 -
我的编码错了,它使用的是“Writers current encoding”。
标签: c# binaryreader