簡體   English   中英

如何將小端格式的 QByteArray 轉換為無符號長整數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM