Readstring из BinaryReader в C# Не читает первый байт

Я читаю двоичный файл, используя BinaryReader из System.IO в C#, однако при использовании 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 - это "bat", а вместо этого она возвращает "at".

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

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

2 ответа

Решение

Как его me86 написал в своем ответе 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;
}

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

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

Другие вопросы по тегам