gpt4 book ai didi

Python 3.1.3 ctypes.structure 未正确排序位并意外修改数据

转载 作者:太空宇宙 更新时间:2023-11-04 06:38:37 25 4
gpt4 key购买 nike

我定义了如下结构

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 位移位。

关于Python 3.1.3 ctypes.structure 未正确排序位并意外修改数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4891186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com