我想访问我定义的 ctype.Structure,作为 Python 中的字节 (
b''
)。
我不知道这是正确的方法吗?我需要将标头(它应该与架构无关)发送到其他设备。
因此我将其定义为:
class Header(ctypes.Structure):
_pack_ = 2
_fields_ = [
('version', c_uint8),
('additional_options', c_uint8),
('soft_version', c_uint16),
('compilation_time', c_uint8 * 6),
('crc', c_uint16)
]
现在我需要计算 CRC。从归档开始
version
到
compilation_time
我有一个处理字节的函数。
所以对我来说,只需将 ctypes.Structure 转换为字节 (b'') 或直接访问内存并更改最后两个就可以了字节。
我尝试过使用 struct 但我没有找到 pragma 选项。
可以使用
bytes
函数将
ctypes.Structure
转换为字节串。
import ctypes
class Header(ctypes.Structure):
_pack_ = 2
_fields_ = [
('version', ctypes.c_uint8),
('additional_options', ctypes.c_uint8),
('soft_version', ctypes.c_uint16),
('compilation_time', ctypes.c_uint8 * 6),
('crc', ctypes.c_uint16)
]
# 实例化 Header 结构体
header = Header()
header.version = 1
header.additional_options = 0
header.soft_version = 100
header.compilation_time = (1, 2, 3, 4, 5, 6)
# ... 设置其他字段 ...
# 将 Header 结构体转换为字节串
header_bytes = bytes(header)
# 打印字节串
print(header_bytes)
解释:
-
bytes(header)
会调用Header
对象的__bytes__
方法,该方法将结构体的内容转换为字节串。 -
_pack_ = 2
指定结构体的对齐方式为 2 字节。这确保了结构体的内存布局与的预期相符。
计算 CRC:
可以使用选择的 CRC 函数来计算从
version
到
compilation_time
字段的 CRC。以下是一个示例,展示了如何使用
zlib.crc32
函数:
import zlib
# ... 代码同上 ...
# 计算 CRC(不包括 'crc' 字段)
crc = zlib.crc32(header_bytes[:-2])
# 将 CRC 设置到 'crc' 字段
header.crc = crc
# 现在 header_bytes 包含完整的带有 CRC 的头信息
header_bytes = bytes(header)
注意:
- 确保使用的 CRC 函数与接收设备的预期相符。
-
可以使用切片
header_bytes[0:12]
来获取从version
到compilation_time
字段的字节串。