[英]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 轉換為大端,我執行以下操作:
baBigEndian[0] = ba[3];
baBigEndian[1] = ba[2];
baBigEndian[2] = ba[1];
baBigEndian[3] = ba[0];
要將大端數組轉換為 unsigned long,我嘗試了以下操作:
baBigEndian.toULong(&ok,10);
小端字節數組正確轉換為大端,但 .toULong 返回 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
它工作正常)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.