0

我知道之前有人问过这个问题,其中一些建议似乎是关于需要 ab 使字符串成为字节文字。但是,我将十六进制代码作为 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)

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

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

4

1 回答 1

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。

于 2018-02-24T00:23:23.437 回答