如何将 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它工作正常)。