如何将小端格式的QByteArray转换为无符号长整型

How to convert a QByteArray in little endian format to a unsigned long

本文关键字:转换 QByteArray 无符号 长整型 格式      更新时间:2023-10-16

我有一个 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 数组转换为无符号长整型数组?或者有没有办法直接从小端数组转换为无符号长整型数组?

提前感谢!

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

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()));