2 l1120101214 l1120101214 于 2015.05.27 10:16 提问

C# BinaryReader.ReadString()方法如何确定从数据流中读多少内容

使用C#的读文件操作代码如下:
using (FileStream input = File.OpenRead("binarydata.dat"))
using (BinaryReader reader = new BinaryReader(input))
{
int intRead = reader.ReadInt32();
byte[] byteRead = reader.ReadBytes(4);
string stringRead = reader.ReadString();
char charRead = reader.ReadChar();
}
其中的ReadString()方法并没有参数告诉它字符串内有多少个字符,它是怎么自动判断的呢?
查阅了MSDN帮助,里面这个方法的说明是这样的
从当前流中读取一个字符串。字符串有长度前缀,一次 7 位地被编码为整数。
说字符串有长度前缀,没没见到这个前缀啊?请大神指导

3个回答

Forty2
Forty2   Rxr 2015.05.27 10:50
已采纳

BinaryWriter.Write(string)会先把字符串的(UTF8编码字节串)**长度**写入,长度用的是"可变长编码",因此可能有1/2/3/4等字节不等。

用于长度的每个字节只用7个比特,最高位用来表示是否有后续长度字节。这样作可以节省空间,比如128以内只要用一个字节来表示长度:
00000101, 最高位零,因此长度为5。
10000001, 00000011, 第一个字节的最高位为1,表示后续字节也要用,用两个字节来表示长度为 1 * 128 + 3 = 131。

l1120101214
l1120101214 回复理论自信不靠删贴: 懂了!万分感谢!
2 年多之前 回复
Forty2
Forty2 第二个例子有错误,因为编码用的是Little Endian(小端在前),因此应该计算为 3 * 128 + 1 = 385
2 年多之前 回复
caozhy
caozhy   Ds   Rxr 2015.05.27 10:20

是这样的,BinaryReader.ReadString是和BinaryWriter.Write(string)配合使用的。
使用后者写入文件的时候,如果写入字符串,是会将字符串的长度也写在文件中的。你可以用BinaryWriter.Write(string)写入文件,然后用UltraEdit打开看看。

l1120101214
l1120101214 看了文件的16进制数据,果然包含了串长度,谢了!!
2 年多之前 回复
l1120101214
l1120101214   2015.05.27 14:55

查看了最终写成的16进制文件,果然发现了字符串长度:

图片说明

第一个串是"hello',长度为5, 第二个串是"ABC"长为3,第三个串是"ab"长为2
万分感谢!

Csdn user default icon
上传中...
上传图片
插入图片