我定义了如下结构
import ctypes
from ctypes import *
class r( BigEndianStructure ):
_fields_ = [( "d0", c_uint32, 28 ),
( "d1", c_uint32, 18 ),
( "d2", c_uint32, 18 ),
( "d3", c_uint16, 16 ),
( "d4", c_uint16, 16 ), ]
然后用下面的代码测试
a = r(0xAAAAAAAA,0xBBBBBBBB,0xCCCCCCCC,0xDDDD,0xEEEE)
for byte in string_at( addressof( a ), sizeof( a ) ):
print(hex(byte),end="")
结果是
0xaa 0xaa 0xaa 0xa0 0xee 0xee 0xc0 0x0 0x33 0x33 0x0 0x0 0xdd 0xdd 0xee 0xee
预期的结果是
0xaa 0xaa 0xaa 0xa0 0xbb 0xbb 0xc0 0x0 0xcc 0xcc 0xc0 0x0 0xdd 0xdd 0xee 0xee
不仅结构没有压缩,结果数据也与输入的不同。是我做错了什么还是 Python 喜欢用自己的想法修改数据?
请您参考如下方法:
看起来问题出在将 18 位宽度值存储为 32 位,然后将它们解释为完整的 32 位值。
让我们看看 0xBBBBBBBB 发生了什么:
0xBBBBBBBB = 10111011101110111011101110111011b
0xBBBBBBBB & 3FFFF (bit width of 18) = 111011101110111011b
如果你的结构看起来像| d0 | 4 个填充位 | d1 | 14 个填充位 | d2 | 14 个填充位 ... | 然后将 d1 的地址解释为 32 位值将是:
11101110111011101100000000000000b = 0xEEEEC000
基本上,当像这样读取内存时,您得到的不是预期值的 18 位掩码,而是 14 位移位。
