Чтение и интерпретация двоичного файла в Qt
Попытка прочитать двоичный файл в Qt.
Файл содержит смешанные текстовые и двоичные (шестнадцатеричные) данные.
Файл содержит области данных с длинами, указанными шестнадцатеричными числами.
Например:
00 01 BE 00 00 00 00 00 00 00 00 00 01
Здесь "BE" находится по смещению BB в файле. BE равен 190, поэтому я прокручиваю вперед до последнего байта выше и знаю, что следующие 190 байтов являются моими данными.
Я несколько дней пытался заставить мой Qt-код преобразовать значение байта "BE", как указано выше, в число 190.
Лучшее, что я получаю, это "-66", что, конечно, 190-256.
Другой пример:
00 01 D3 63 00 00 00 00 00 00 00 01
Должен быть преобразован в "63D3", который является 25555 десятичным.
Вот мои фрагменты кода:
Прочитайте файл:
QFile file(iFile); if (!file.open(QIODevice::ReadOnly)) return; QByteArray iContents = file.readAll();
Получить длину
ushort c3 = 0xFF; c3 = iContents.at(2); // c3 should be "BE" hex. printf ( "%0x %d\n", c3, c3 );
Выход:
FFFFFFBE -66
Как я могу получить это читается как 190?
Я пробовал разные вещи после поиска, но, похоже, ничего не работает, что говорит о том, что я упускаю что-то базовое в своем коде.
Текущий код для преобразования: десятичный
1 ответ
QByteArray::at()
возвращает (подписано) char
и вы назначаете его unsigned short
, Вы хотите, чтобы значение 0xbe рассматривалось как беззнаковое, поэтому вы должны привести его:c3 = (unsigned char) iContents.at(2);
Для 2-байтового числа с прямым порядком байтов (я полагаю, это просто D363
тебя интересуют а нули тут бессмысленны?)
unsigned short i = (unsigned char) iContent.at(2) | (unsigned char) iContent.at(3) << 8;
(unsigned char)
приведение имеет наивысший приоритет, а операнды побитовых операторов переводятся в целые числа (поэтому результат сдвига не равен нулю).