BinaryWriter.Write()如何写字符串

时间:2009-09-27 04:05:38

标签: .net

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

  

将长度为前缀的字符串写入   此流在当前编码中   BinaryWriter,推进了   流的当前位置   按照使用的编码和   正在写的特定字符   到了溪流。

我认为长度前缀是固定大小的;但实际上它的大小可变。 关于此方法如何计算前缀长度的任何细节?

2 个答案:

答案 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实例的当前编码将该多个字符写入流