我知道之前已经问过这个问题,并且一些建议似乎是需要一个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。
任何人都可以建议如何克服错误。
答案 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。