ctypesと構造体を使用した場合、大きなエンディアンと小さなエンディアンの型、および特定のビット長のフィールドで異なる結果が表示されます。私は両方のエンディアンでバイトの順序が同じであると期待しますが、結果は異なる答えを提供しています。結果は、インテルボックス上のcentos 6.8 64ビットディストリビューションからのものです。ctypes bigendianstructure littlendianstructureが1バイトで異なる結果を返す
>>> import ctypes
>>>
>>> class header_struct(ctypes.Structure):
... _fields_ = [ ('f1',ctypes.c_ubyte,4),
... ('f2',ctypes.c_ubyte,4) ]
...
>>> class header_struct_be(ctypes.BigEndianStructure):
... _fields_ = [ ('f1',ctypes.c_ubyte,4),
... ('f2',ctypes.c_ubyte,4) ]
...
>>> class header_struct_le(ctypes.LittleEndianStructure):
... _fields_ = [ ('f1',ctypes.c_ubyte,4),
... ('f2',ctypes.c_ubyte,4) ]
...
>>> a='\x0A'
>>> x=header_struct.from_buffer_copy(a)
>>> x_be=header_struct_be.from_buffer_copy(a)
>>> x_le=header_struct_le.from_buffer_copy(a)
>>>
>>> print " sizeof(x) ", ctypes.sizeof(x)
sizeof(x) 1
>>> print " sizeof(x_be) ", ctypes.sizeof(x_be)
sizeof(x_be) 1
>>> print " sizeof(x_le) ", ctypes.sizeof(x_le)
sizeof(x_le) 1
>>>
>>> x.f1
10
>>> x_be.f1
0
>>> x_le.f1
10
>>>
>>>
>>> x.f2
0
>>> x_be.f2
10
>>> x_le.f2
0
>>>
Meh、これは本当に直感的ではない結果です。 – jsbueno