Почему мои 2 байта (0x00 0x40), которые должны быть 64, вместо этого производят 16384?

Пожалуйста, просмотрите этот файл, используя Hex Editor:

Шестнадцатеричный дамп

Я читаю 2 байта следующим образом:

BinaryReader binaryReader;
int wlen = binaryReader.ReadUInt16();

Когда я читаю эти 2 байта, мой BinaryReader.BaseStream.Position равен 14, но wlen = 16384, и это должно быть 64. Что я делаю неправильно?


person david hol    schedule 23.11.2015    source источник
comment
Даю подсказку... 0x4000 == 16384, нужно поменять местами байты.   -  person Ron Beyer    schedule 23.11.2015
comment
Покажите настоящий код. Этот фрагмент просто генерирует файл NullReferenceException.   -  person Ondrej Tucny    schedule 23.11.2015
comment
Что сказал @Ron. Прежде чем приступить к разбору произвольных байтов, узнайте о порядке следования байтов.   -  person CodeCaster    schedule 23.11.2015


Ответы (2)


Похоже, ваш файл данных создан каким-то автором big-endian, в то время как BinaryReader читает данные предполагая представление с прямым порядком байтов.

Если у вас есть контроль над форматом файла, изменение модуля записи для создания представления с прямым порядком байтов позволит вам избежать внесения изменений в вашу программу C#.

В .NET также есть несколько способов чтения данных с обратным порядком байтов. Вы можете использовать BitConverter, но обращение байтов вручную, вероятно, является наиболее эффективным:

public static short ToInt16Be(byte[] buf, int pos) {
    return (short)(buf[pos]<<8 | buf[pos+1]);
}
person Sergey Kalinichenko    schedule 23.11.2015

binaryReader.ReadUInt16() читает с прямым порядком байтов.

См.: https://msdn.microsoft.com/en-us/library/system.io.binaryreader.readuint16(v=vs.110).aspx

person fjardon    schedule 23.11.2015