#c #windows #qt5
#c #Windows #qt5
Вопрос:
Я хочу использовать qint16_be, quint16_be, quint32_be и т. Д. В качестве типа данных для big endian, что я пытаюсь, это что-то вроде этого
#include <QtEndian>
typedef quint16_be uint16_t;
И я получаю сообщение об ошибке
C:/Qt/5.15.2/mingw81_64/include/QtCore/qendian.h:429:28: error: conflicting declaration 'typedef QBEInteger<short int> qint16_be'
typedef QBEInteger<qint16> qint16_be;
C:/Qt/Tools/mingw810_64/x86_64-w64-mingw32/include/stdint.h:38:25: note: previous declaration as 'typedef short unsigned int qint16_be'
typedef unsigned short qint16_be;
Я не включил stdint.h в моем проекте.
Есть идеи, как мне это решить
Комментарии:
1. Определение
typedef quint16_be uint16_t;
может конфликтовать с uint16_t (определеноstdint.h
и принято вcstdint
). Это, по-моему, действительно плохая идея и, вероятно, причина вашей ошибки. Кстати. вы запускаете свой код на архитектуре с большим расширением? Вы когда-нибудь намеревались скомпилировать его везде?2. typedef беззнаковое короткое qint16_be; Выглядит как-то странно. Разве это не должно быть quint16_be ? Опечатка?
3. Я не включил stdint. h в моем проекте. Вы нет, но как насчет Qt?
4. Для этого qToBigEndian и qFromBigEndian кажутся мне правильным выбором.
5.
typedef
Имхо, стоит только придать ему правильный размер. Тем не менее, мне это кажется немного странным. Я бы использовал шаблонный класс с перегруженным присваиванием, который допускает, что собственный конечный код заменяется в случае.
Ответ №1:
Вот так: MCVE для qToBigEndian():
#include <QtCore>
int main()
{
const uint16_t sample = 0x0201;
QByteArray data((const char*)amp;sample, sizeof sample);
qDebug() << data;
const uint16_t sampleBE = qToBigEndian(sample);
QByteArray dataBE((const char*)amp;sampleBE, sizeof sampleBE);
qDebug() << dataBE;
}
Вывод:
"x01x02"
"x02x01"
Я запустил этот образец в VS2019 на своем ноутбуке Intel, который имеет архитектуру little-endian.
Соответственно, порядок байтов был изменен из-за вызова qToBigEndian()
.
Преобразование в QByteArray
было быстрым взломом.
Тем не менее, преобразование const uint16_t*
в const char*
разрешено (с намерением получить доступ к байтовому представлению чего-либо).
memcpy() — еще один разрешенный способ добиться этого.
Комментарии:
1. Спасибо, Шефф, у меня есть идея. Но основная проблема по-прежнему остается. Если я включаю <QtEndian>, компилятор жалуется на конфликтующее объявление. это потому, что в stdint. h у нас есть typedef беззнаковое короткое qint16_be; в то время как в qtendian. h у нас есть typedef QBEInteger<qint16> qint16_be; где quint16 имеет тип typedef short qint16
2. в stdint. h я сомневаюсь, что у нас есть typedef беззнаковый короткий qint16_be . (Если он будет там, это не стандарт
stdint.h
или он сломан.)3. Спасибо, Шефф. Именно там я бы углубился в это. Спасибо за информацию