我使用BinaryWriter.Write()来编写字符串,在msdn中,描述如下:
将长度为前缀的字符串写入 此流在当前编码中 BinaryWriter,推进了 流的当前位置 按照使用的编码和 正在写的特定字符 到了溪流。
我认为长度前缀是固定大小的;但实际上它的大小可变。 关于此方法如何计算前缀长度的任何细节?
答案 0 :(得分:12)
前缀使用无符号LEB128格式进行编码:http://en.wikipedia.org/wiki/LEB128
基本上,如果长度为127或更短,则写入一个字节。如果它更大,则设置高位,并写入长度的下7位。如果仍然没有足够的位(长度为16k或更大),则再次设置高位,并写入另外7位。
因此,存储长度需要尽可能多的字节,每个字节将有7位长度,高位将告诉长度是否存在另一个字节。
答案 1 :(得分:6)
对于.NET 4.0及更高版本,MSDN also says:
长度前缀字符串表示字符串长度,方法是在字符串前面加上包含该字符串长度的单个字节或单词。此方法首先将字符串的长度写为UTF-7编码的无符号整数,然后使用BinaryWriter实例的当前编码将该多个字符写入流。
对于早期版本,它说:
长度前缀字符串表示字符串长度,方法是在字符串前面加上包含该字符串长度的单个字节或单词。此方法首先将字符串的长度写为四字节无符号整数,然后使用BinaryWriter实例的当前编码将该多个字符写入流。