BinaryReader ReadString指定长度?

Cor*_*urn 3 c# binaryreader

我正在研究解析器以接收UDP信息,解析它并存储它.为此,我使用的是BinaryReader因为它主要是二进制信息.其中一些将是字符串.MSDN说ReadString()功能:

从当前流中读取字符串.该字符串以长度为前缀,一次编码为整数7位.

我完全理解它,直到"一次七位",我试图忽略,直到我开始测试.我在创建自己的字节数组之前将其放入a MemoryStream并尝试使用a读取它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();
Run Code Online (Sandbox Code Playgroud)

知道一个int是4个字节(并且足够长时间找到它BinaryReader是Little Endian)我传给它3的长度和相应的字母.然而str最终举行\0\0\0.如果我删除3个零并且只是

byte[] data = new byte[] { 3, (byte)'C', (byte)'a', (byte)'t', }
Run Code Online (Sandbox Code Playgroud)

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

我正在编写一个协议,需要在将文档传递给客户之前完全理解我正在进行的工作.

Cor*_*urn 6

我找到了源代码BinaryReader.它使用一个名为Read7BitEncodedInt()的函数,在查找该文档和Write7BitEncodedInt()的文档之后,我发现了这个:

值参数的整数一次写入7位,从7个最低有效位开始.字节的高位表示在此字节之后是否有更多字节要写入.如果value适合7位,则只需要一个字节的空间.如果值不适合7位,则在第一个字节上设置高位并写出.然后将值移位7位并写入下一个字节.重复此过程,直到写入整个整数.

此外,拉尔夫发现这个链接可以更好地显示正在发生的事情.