结构。 python 3中的pack错误 - struct.error:'s'的参数必须是一个bytes对象

时间:2018-02-24 00:16:51

标签: python python-3.x struct.pack

我知道之前已经问过这个问题,并且一些建议似乎是需要一个b来使字符串成为字节文字。但是,我将十六进制代码传递给函数0x414243以将其保存为ABC。

def _pack(_data, size):
    numofbytes = size/8
    print("Chars Expected: " + str(numofbytes))
    formatString = "{}s".format(int(numofbytes))
    print("Formatted String:" + formatString)
    struct.pack(formatString,_data)

_pack(0x414243,24)

我不知道在这里要改变什么,我想知道它是如何使用formatstring变量的问题。我希望函数能够计算出大小中传递的数据中有多少个字符,在这种情况下24位= 3个字节,因此它格式化3s并传递0x414243以转换为ABC。

任何人都可以建议如何克服错误。

1 个答案:

答案 0 :(得分:0)

正如错误消息所示,struct.pack()想要一组字节,并且你给它一个整数。

如果您希望能够以整数形式传递数据,请在打包之前将其转换为字节:

_data = _data.to_bytes(numofbytes, "big")   # or "little", depending on endianness

或者只是在调用时以字节为单位传递数据:

_pack(b"0x410x420x43", 24)

如果你有一个包含十六进制的字符串,例如"0x414243",你可以将它转换为整数,然后转换为字节:

_data = int(_data, 16).to_bytes(numofbytes, "big")    

您可以使用isinstance()来允许您的函数接受以下任何格式:

if isinstance(_data, str):
    _data = int(_data, 16)
if isinstance(_data, int):
    _data = _data.to_bytes(numofbytes, "big")

顺便说一下,如果size不是8的倍数,则计算字节数将产生浮点答案。小数字节是一个错误。解决这个问题:

numofbytes = size // 8 + bool(size % 8)

如果剩下任何位,+ bool(size % 8)位会将整数除法的结果加1。