gpt4 book ai didi

python - 如何使用 ctypes 读取多字节值

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

我想使用 ctypes Structure 和 Union 从字节对象中读取两个连续的 24 位值。这将是 6 个字节。

不幸的是,ctypes 读取每个值 32 位。此外,sizeof 报告结构比预期的要大。

使用 _pack_ = 1 没有带来预期的结果。

具有最小结构和二进制示例值的示例:

import unittest
import ctypes

SixBytes = ctypes.c_uint8 * 6

class MultiBits(ctypes.BigEndianStructure):
_pack_ = 1
_fields_ = [
("x", ctypes.c_uint, 24),
("y", ctypes.c_uint, 24),
]

class Multi(ctypes.Union):
_fields_ = [
("bits", MultiBits),
("asbytes", SixBytes),
]

class TestMultibyte(unittest.TestCase):
def test_size(self):
self.assertEqual(ctypes.sizeof(MultiBits), 6)

def test_multibyte(self):
data = b'\x00\x01\x01\x00\x01\x02'
parser = Multi()
parser.asbytes = SixBytes(*data)
self.assertEqual(parser.bits.x, 257)
self.assertEqual(parser.bits.y, 258)

我原以为 sizeof(MultiBits)6 并且值被正确解析。

相反,sizeof(MultiBits) 被报告为 8 并且 parser.bits.y 是预期结果的 256 倍。

我是不是做错了或预料到了什么?

最佳答案

您可以使用 int.from_bytes 一次解码 24 位(3 个字节)。

data = b'\x00\x01\x01\x00\x01\x02'
[int.from_bytes(data[i:i+3], byteorder='little', signed=False) for i in range(0, len(data), 3)]
>>> [65792, 131328]

整数在您的代码中是无符号的,我猜字节顺序是小端序,尽管看起来您的测试假设是大端序。

关于python - 如何使用 ctypes 读取多字节值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57048398/

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