BinaryWriter.Write()如何写字符串

CMi*_*nus 4 .net

我使用BinaryWriter.Write()来编写字符串,在msdn中,描述如下:

在BinaryWriter的当前编码中将长度为前缀的字符串写入此流,并根据使用的编码和写入流的特定字符推进流的当前位置.

我认为长度前缀是固定大小的; 但实际上它的大小可变.有关此方法如何计算前缀长度的详细信息?

小智 14

前缀使用未签名的LEB128格式编码:http: //en.wikipedia.org/wiki/LEB128

基本上,如果长度为127或更小,则写入单个字节.如果它更大,则设置高位,并写入长度的下7位.如果仍然没有足够的位(长度为16k或更大),则再次设置高位,并写入另外7位.

因此,存储长度需要尽可能多的字节,每个字节将有7位长度,高位将告诉长度是否存在另一个字节.


Rex*_*x M 6

对于.NET 4.0及更高版本,MSDN 还说:

带长字符的字符串表示字符串长度,方法是在字符串前面加上包含该字符串长度的单个字节或单词.此方法首先将字符串的长度写为UTF-7编码的无符号整数,然后使用BinaryWriter实例的当前编码将该多个字符写入流中.

对于早期版本,它说:

带长字符的字符串表示字符串长度,方法是在字符串前面加上包含该字符串长度的单个字节或单词.此方法首先将字符串的长度写为四字节无符号整数,然后使用BinaryWriter实例的当前编码将该多个字符写入流中.