Чтение и интерпретация двоичного файла в 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 десятичным.

Вот мои фрагменты кода:

  1. Прочитайте файл:

    QFile file(iFile);
    if (!file.open(QIODevice::ReadOnly)) return;
    QByteArray iContents = file.readAll();
    
  2. Получить длину

    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) приведение имеет наивысший приоритет, а операнды побитовых операторов переводятся в целые числа (поэтому результат сдвига не равен нулю).

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