python将int转换为任意字节数

2024-09-29 17:21:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正面临一个著名的小案子结构包. 你知道吗

情况如下:我有一个带有python薄层包装器的dll。wrapper中的一个python方法接受字节数组作为参数。此字节数组表示特定硬件总线上的寄存器。每个总线具有不同的寄存器宽度,通常为8、16和24位宽(所有情况下对齐方式相同)。你知道吗

当调用这个方法时,我需要将我的值(不管是什么)转换成8/16或24位的字节数组。这样的转换相对容易,8位或16位使用结构包地址:

byteList = struct.pack( '>B', regValue )    # For 8 bits case
byteList = struct.pack( '>H', regValue )    # for 16 bits case

我现在正在寻找使它足够灵活的所有三种情况8/16和24位。我可以用前两行来处理这三个案子,但我觉得很难看。你知道吗

我希望这能奏效:

packformat = ">{0}B".format(regSize)
byteList = struct.pack( packformat, regValue )

但事实并非如此结构包期望有相同数量的参数。你知道吗

你知道如何将寄存器值转换成任意字节数吗?你知道吗


Tags: 方法参数字节情况数组结构寄存器struct
1条回答
网友
1楼 · 发布于 2024-09-29 17:21:36

你总是打包无符号的整数,而且只有big endian启动。看看打包时会发生什么:

>>> import struct
>>> struct.pack('>B', 255)
'\xff'
>>> struct.pack('>H', 255)
'\x00\xff'
>>> struct.pack('>I', 255)
'\x00\x00\x00\xff'

基本上,该值在开始处用空字节填充。利用这个优势:

>>> struct.pack('>I', 255)[-3:]
'\x00\x00\xff'
>>> struct.pack('>I', 255)[-2:]
'\x00\xff'
>>> struct.pack('>I', 255)[-1:]
'\xff'

如果值太大,现在不会出现异常,但这会极大地简化代码。始终可以添加单独的验证步骤:

def packRegister(value, size):
    if value < 0 or value.bit_length() > size:
        raise ValueError("Value won't fit in register of size {} bits".format(size))
    return struct.pack('>I', value)[-(size // 8):]

演示:

>>> packRegister(255, 8)
'\xff'
>>> packRegister(1023, 16)
'\x03\xff'
>>> packRegister(324353, 24)
'\x04\xf3\x01'
>>> packRegister(324353, 8)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in packRegister
ValueError: Value won't fit in register of size 8 bits

相关问题 更多 >

    热门问题