如何将 little endian 格式的 QByteArray 转换为 unsigned long
How to convert a QByteArray in little endian format to a unsigned long
我有一个 QByteArray,它有 4 个小端格式的值
QByteArray ba;
ba.append(0xbb);
ba.append(0x1c);
ba.append(0x51);
ba.append(0x1e);
要将 ba 转换为 big endian,我执行以下操作:
baBigEndian[0] = ba[3];
baBigEndian[1] = ba[2];
baBigEndian[2] = ba[1];
baBigEndian[3] = ba[0];
为了将大端数组转换为无符号长整数,我尝试了以下操作:
baBigEndian.toULong(&ok,10);
小端字节数组正确转换为大端,但 .toULong returns 0 而不是 508632251。
如何将 baBigEndian 数组转换为无符号长整数?或者有没有办法直接从小端数组转换为无符号长?
提前致谢!
toULong()
将不起作用,因为它期望 QByteArray 包含 ASCII 格式的数字字符串表示形式(例如 "0xbb1c511e"
,即 10 个 ASCII 字节),而您的 QByteArray 包含改为文字二进制字节(例如 0xbb1c511e
,即 4 个二进制字节)。
假设您的 QByteArray 包含大端格式的四个字节(就像在您的示例代码中的第 2 步之后所做的那样),那么这将起作用:
unsigned long val = ntohl(*((const unsigned long *)ba.data()));
但是请注意,sizeof(unsigned long)
不能保证在所有平台上都是 4 个字节,因此您最好使用保证始终为 4 个字节宽的固定宽度类型,例如
quint32 val = ntohl(*((const quint32 *)ba.data()));
尝试memcpy
quint32 value = 0; //or qint32
memcpy(&value, baBigEndian.data(), sizeof(quint32));//or baBigEndian instead baBigEndian.data() if you use plain array instead QByteArray
此外,可以使用 reinterpret_cast
来完成,但我不建议您使用 reinterpret_cast
,因为我在 arm
处理器上遇到了一些问题(而在 x86
它工作正常)。
我有一个 QByteArray,它有 4 个小端格式的值
QByteArray ba;
ba.append(0xbb);
ba.append(0x1c);
ba.append(0x51);
ba.append(0x1e);
要将 ba 转换为 big endian,我执行以下操作:
baBigEndian[0] = ba[3];
baBigEndian[1] = ba[2];
baBigEndian[2] = ba[1];
baBigEndian[3] = ba[0];
为了将大端数组转换为无符号长整数,我尝试了以下操作:
baBigEndian.toULong(&ok,10);
小端字节数组正确转换为大端,但 .toULong returns 0 而不是 508632251。
如何将 baBigEndian 数组转换为无符号长整数?或者有没有办法直接从小端数组转换为无符号长?
提前致谢!
toULong()
将不起作用,因为它期望 QByteArray 包含 ASCII 格式的数字字符串表示形式(例如 "0xbb1c511e"
,即 10 个 ASCII 字节),而您的 QByteArray 包含改为文字二进制字节(例如 0xbb1c511e
,即 4 个二进制字节)。
假设您的 QByteArray 包含大端格式的四个字节(就像在您的示例代码中的第 2 步之后所做的那样),那么这将起作用:
unsigned long val = ntohl(*((const unsigned long *)ba.data()));
但是请注意,sizeof(unsigned long)
不能保证在所有平台上都是 4 个字节,因此您最好使用保证始终为 4 个字节宽的固定宽度类型,例如
quint32 val = ntohl(*((const quint32 *)ba.data()));
尝试memcpy
quint32 value = 0; //or qint32
memcpy(&value, baBigEndian.data(), sizeof(quint32));//or baBigEndian instead baBigEndian.data() if you use plain array instead QByteArray
此外,可以使用 reinterpret_cast
来完成,但我不建议您使用 reinterpret_cast
,因为我在 arm
处理器上遇到了一些问题(而在 x86
它工作正常)。