2014-08-29 3 views
1

Я читаю двоичный файл, используя BinaryReader из System.IO в C#, однако при использовании ReadString он не читает первый байт, вот код:Readstring из BinaryReader в C# Не читает первый байт

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

не что-то очень трудно, сначала он читает два целых, но строка, которая должна вернуть objame это «битой», а вместо этого он возвращает «в».

Связано ли это с двумя первыми целями, которые я прочитал? Или, может быть, beacause между первым int и строкой нет нулевого байта?

Заранее спасибо.

+3

Вы уверены, что ints перед первой строкой на самом деле составляют 4 байта? Возможно, вам следует опубликовать код, который записывает файл? – BradleyDotNET

ответ

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] (http://en.wikipedia.org/wiki/String_%28computer_science%29#Length-prefixed) , –

3

Строке в файле должна предшествовать 7-разрядная кодированная длина. От MSDN:

Считывает строку из текущего потока. Строка имеет префикс длины, закодированной как целых семь бит за раз.