gpt4 book ai didi

c# - BinaryReader ReadString 指定长度?

转载 作者:行者123 更新时间:2023-11-30 14:31:36 29 4
gpt4 key购买 nike

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

Reads a string from the current stream. The string is prefixed with the length, encoded as an integer seven bits at a time.

直到“一次七位”我才完全理解它,在我开始测试之前我试图简单地忽略它。我正在创建自己的字节数组,然后将其放入 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 个字符的字符串(因为对应于文档的 7 位部分,这将是 01111111)?

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

最佳答案

我找到了 source code对于 BinaryReader。它使用一个名为 Read7BitEncodedInt() 的函数在查找该文档和 Write7BitEncodedInt() 的文档之后我发现了这个:

The integer of the value parameter is written out seven bits at a time, starting with the seven least-significant bits. The high bit of a byte indicates whether there are more bytes to be written after this one. If value will fit in seven bits, it takes only one byte of space. If value will not fit in seven bits, the high bit is set on the first byte and written out. value is then shifted by seven bits and the next byte is written. This process is repeated until the entire integer has been written.

另外,Ralf 发现了 this link更好地显示正在发生的事情。

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com