2014-08-29 141 views
1

我正在使用C#中的System.IO中的BinaryReader读取二进制文件,但是在使用ReadString时,它不读取第一个字节,下面是代码:从C#中的BinaryReader读取字符串不读取第一个字节

using (var b = new BinaryReader(File.Open(open.FileName, FileMode.Open))) 
{ 
    int version = b.ReadInt32(); 
    int chunkID = b.ReadInt32(); 
    string objname = b.ReadString(); 
} 

是不是真的很难,首先它读取两个整数,但应该返回objame字符串为“蝙蝠”,而是返回“AT”。

这是否与我读过的两个第一个整数有关?或者可能是因为第一个int和字符串之间没有空字节?

在此先感谢。

+3

您确定第一个字符串之前的整数实际上是4个字节吗?也许你应该发布写入文件的代码? – BradleyDotNET 2014-08-29 23:50:01

回答

3

由于itsme86在他的回答中写道BinaryReader.ReadString()都有自己的工作方式,当创建的文件中使用BinaryWriter.Write(string val)它应该只被使用。

在你的情况你可能有一个固定大小的字符串,你可以使用BinaryReader.ReadChars(int count)或者你有一个空终止的字符串,你必须读取,直到遇到0字节。这里有一个可能的扩展方法,用于读取以空字符结尾的字符串:

public static string ReadNullTerminatedString(this System.IO.BinaryReader stream) 
{ 
    string str = ""; 
    char ch; 
    while ((int)(ch = stream.ReadChar()) != 0) 
     str = str + ch; 
    return str; 
} 
+0

那么它不一定要用'BinaryWriter.Write'制作,它只需要一个[pascal string](http://en.wikipedia.org/wiki/String_%28computer_science%29#Length-prefixed) 。 – 2014-08-30 01:04:02

3

文件中的字符串前应加上7位编码长度。从MSDN

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