python将int转换为任意字节数

python将int转换为任意字节数,python,python-2.7,struct,Python,Python 2.7,Struct,我面对的是著名的struct.pack的一个小角落 情况如下:我有一个带有python薄层包装器的dll。wraper中的一个python方法接受字节数组作为参数。该字节数组表示特定硬件总线上的寄存器。每条总线具有不同的寄存器宽度,通常为8、16和24位宽(所有情况下对齐方式相同) 调用此方法时,我需要将我的值(无论是什么)转换为8/16或24位的字节数组。使用struct.pack进行8位或16位转换相对容易: byteList = struct.pack( '>B', regValue

我面对的是著名的struct.pack的一个小角落

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

调用此方法时,我需要将我的值(无论是什么)转换为8/16或24位的字节数组。使用struct.pack进行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 )
但实际情况并非如此,因为struct.pack需要相同数量的参数

你知道如何将我的寄存器值(整齐地)转换成任意数量的字节吗?

你总是在打包无符号整数,而且只有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):]
def packRegister(值、大小): 如果值<0或值.bit_length()>大小: raise VALUERROR(“值不适合大小为{}位的寄存器”。格式(大小)) 返回结构包('>I',值)[-(大小//8):] 演示:

包装登记员(255,8) “\xff” >>>packRegister(1023,16) “\x03\xff” >>>packRegister(324353,24) “\x04\xf3\x01” >>>packRegister(324353,8) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 文件“”,第3行,在packRegister中 ValueError:值不适合大小为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