2

我有一个 QByteArray,有 4 个小端格式的值

QByteArray ba;
ba.append(0xbb);
ba.append(0x1c);
ba.append(0x51);
ba.append(0x1e);

要将 ba 转换为大端,我执行以下操作:

baBigEndian[0] = ba[3];
baBigEndian[1] = ba[2];
baBigEndian[2] = ba[1];
baBigEndian[3] = ba[0];

要将大端数组转换为无符号长数组,我尝试了以下操作:

baBigEndian.toULong(&ok,10);

小端字节数组已正确转换为大端,但 .toULong 返回 0 而不是 508632251。

如何将 baBigEndian 数组转换为无符号长整数?或者有没有办法直接从小端数组转换为无符号长?

提前致谢!

4

2 回答 2

0

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()));
于 2019-12-07T05:13:42.317 回答
0

尝试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它工作正常)。

于 2019-12-07T08:43:23.323 回答