Строка чтения из BinaryReader в C# Не читает первый байт

Я читаю двоичный файл с помощью BinaryReader из System.IO в С#, однако при использовании ReadString он не читает первый байт, вот код:

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».

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

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


person Seyren Windsor    schedule 29.08.2014    source источник
comment
Вы уверены, что целые числа перед первой строкой на самом деле имеют длину 4 байта? Возможно, вам следует опубликовать код, который записывает файл?   -  person BradleyDotNET    schedule 30.08.2014


Ответы (2)


Как 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;
}
person T_D    schedule 30.08.2014
comment
Ну, это не обязательно должно быть сделано с BinaryWriter.Write, это просто должно быть паскаль строка. - person Scott Chamberlain; 30.08.2014

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

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

person itsme86    schedule 29.08.2014