python - 如何使用 ctypes 读取多字节值
问题描述
我想使用 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)
报告为预期结果的 256 倍8
。parser.bits.y
我是在做错事还是期待错事?
解决方案
您可以一次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]
整数在您的代码中是无符号的,我猜测字节顺序是小端,尽管看起来您的测试假设是大端。
推荐阅读
- r - rvest 抓取不同长度的数据
- python - Python - 硒得到错误:消息:元素
无法通过键盘访问 - matlab-deployment - 用于 Java 封装 Matlab 函数的“mlx”接口?
- r - 如何标记 ggridges 包中每个 bin 的计数?
- c++ - 升级到 macOS Catalina 后使用 cmake 为 c++ 构建 opencv4 失败
- angular - Angular:“Window & typeof globalThis”类型上不存在属性“xxx”
- docusignapi - 尝试发送 eNotary 信封时出现错误 NOTARY_HOSTED_SIGNER_ID_REQUIRED
- javascript - 如何使 onClick 适用于数字形式的标签?
- c# - 用位读写负数
- python - PyModbus 无法通过 TCP 读取 RTU 中的输入寄存器