将 QByteArray 转换为 unsigned short:不符合预期
Convert QByteArray to unsigned short: not as expected
我有一个 QByteArray
这样的:
QByteArray idx0;
// idx0 is then assigned 4 bytes,
// idx0 content is shown on debugger as:
// idx0 "[=10=]0[=10=]0[=10=]1[=10=]0" QByteArray
// '[=10=]' 0 0x00 char
// '[=10=]' 0 0x00 char
// 1 0x01 char
// '[=10=]' 0 0x00 char
我像这样将 QbyteArray
转换为 unsigned short
:
unsigned short ushortIdx0;
if ( idx0.size() >= sizeof(ushortIdx0) ) {
ushortIdx0 = *reinterpret_cast<const unsigned short *>( idx0.data() );
}
调试器将 ushortIdx0
值显示为 0
:
// Debugger shows:
//
// ushortIdx0 0 unsigned short
但是,当我通过this website将0x 00 00 01 00
的Little Endian值转换为UINT32 - Little Endian
时,我得到:
UINT32 - Little Endian (DCBA):
Raw UINT32
00 01 00 00 65536
为什么 that website 的结果与我通过代码得到的结果不同?我不明白。感谢您的帮助。
根据评论,您不能总是假设 unsigned short
是特定大小。如果您知道您需要一个具有一定位数的无符号整数,那么请使用 cstdint
中的适当类型 - 在这种情况下为 uint32_t
。
关于字节序问题,既然您正在使用 Qt
为什么不以平台不可知的方式使用 QDataStream
到 serialize/deserialize 数据。写一个无符号的 32 位整数使用...
quint32 data = ...;
QByteArray ba;
QDataStream ds(&ba, QIODevice::ReadWrite);
ds << data;
类似地读回数据。
我有一个 QByteArray
这样的:
QByteArray idx0;
// idx0 is then assigned 4 bytes,
// idx0 content is shown on debugger as:
// idx0 "[=10=]0[=10=]0[=10=]1[=10=]0" QByteArray
// '[=10=]' 0 0x00 char
// '[=10=]' 0 0x00 char
// 1 0x01 char
// '[=10=]' 0 0x00 char
我像这样将 QbyteArray
转换为 unsigned short
:
unsigned short ushortIdx0;
if ( idx0.size() >= sizeof(ushortIdx0) ) {
ushortIdx0 = *reinterpret_cast<const unsigned short *>( idx0.data() );
}
调试器将 ushortIdx0
值显示为 0
:
// Debugger shows:
//
// ushortIdx0 0 unsigned short
但是,当我通过this website将0x 00 00 01 00
的Little Endian值转换为UINT32 - Little Endian
时,我得到:
UINT32 - Little Endian (DCBA): Raw UINT32 00 01 00 00 65536
为什么 that website 的结果与我通过代码得到的结果不同?我不明白。感谢您的帮助。
根据评论,您不能总是假设 unsigned short
是特定大小。如果您知道您需要一个具有一定位数的无符号整数,那么请使用 cstdint
中的适当类型 - 在这种情况下为 uint32_t
。
关于字节序问题,既然您正在使用 Qt
为什么不以平台不可知的方式使用 QDataStream
到 serialize/deserialize 数据。写一个无符号的 32 位整数使用...
quint32 data = ...;
QByteArray ba;
QDataStream ds(&ba, QIODevice::ReadWrite);
ds << data;
类似地读回数据。