2014-08-29 150 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位整數。