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:
Читает строку из текущего потока. Строка имеет префикс длины, закодированный в виде целого числа семь битов за раз.