我想使用 Python3 ctypes 位域構造一個無符號的 32 位 int,如下:
c_uint = ctypes.c_uint32
class Flags_bits(ctypes.LittleEndianStructure):
_fields_ = [
("a", c_uint, 4),
("b", c_uint, 4),
("c", c_uint, 4),
("d", c_uint, 4),
("e", c_uint, 4),
("f", c_uint, 4),
("g", c_uint, 4),
("h", c_uint, 4)]
當我Flags_bits用特定的整數值替換時,
aa = Flags_bits(1,2,3,4,5,6,7,8)
print(hexlify(aa).decode('utf-8'))
輸出是
21436587
我期待像這樣的輸出
87654321 # binary of 1000 0111 0110 0101 0100 0011 0010 0001
由于 Little-endian 從低位開始構造位。如何獲得預期的輸出?是不是我做錯了什么?有人可以幫助我嗎?提前致謝!
uj5u.com熱心網友回復:
它以小端方式存盤。該binascii.hexlify函式將值作為一組位元組讀取,并回傳這些位元組的字串。它沒有將它們視為整數。作為位元組,值是 21 43 65 87。除非您將一組位元組視為一個多位元組單元,否則位元組序不適用。
如果您想將該值視為 32 位整數,請執行此操作,結果為 87654321:
import struct
...
aa = Flags_bits(1,2,3,4,5,6,7,8)
aa_int = struct.unpack('I',aa)[0]
print(hex(aa_int))
位域結構是有問題的,即使在 C 中也是如此。老實說,在許多情況下,移位和屏蔽更容易:
def Flags_bits(*data):
val = 0
for n in reversed(data):
val = (val << 4) | n
return val
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/478440.html
上一篇:從csv檔案中的多行中提取唯一值
