为什么Python结构模块不能用小endian打包(或解包)多字节

2024-10-03 21:26:45 发布

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

我在处理一些多字节的问题。例如,我有一个变量a = b'\x00\x01\x02\x03',它是bytes对象而不是int。我想struct.pack将它与小endian组合成一个包,但是<4s不起作用。实际上,<4s>4s得到了相同的结果。如果我希望结果是b'\x03\x02\x01\x00,该怎么办。
我知道我可以使用struct.pack('<L', struct.unpack('>L', a)),但它是处理多字节对象的唯一方法吗?你知道吗

示例:

import struct
import secrets

mhdr = b'\x20'
joineui = b'\x00\x01\x02\x03\x04\x05\x06\x07'
deveui = b'\x08\x09\x10\x11\x12\x13\x14\x15'
devnonce = secrets.token_bytes(2)

joinreq = struct.pack(
    '<s8s8s2s',
    mhdr,
    joineui,
    deveui,
    devnonce,
)

# The expected joinreq should be b'\x20\x07\x06\x05\x04\x03\x02\x01\x00\x15\x14\x13\x12\x11\x10\x09\x08...'

Tags: 对象import字节bytesstructpacksecretsx00
1条回答
网友
1楼 · 发布于 2024-10-03 21:26:45

在我看来,你不想有4个单字符,而是1个整数。 所以你应该试着用“i”或“i”(无论是有符号的还是无符号的)来代替“4s”。你知道吗

你的例子应该是

import struct
import secrets

mhdr = b'\x20'
joineui = b'\x00\x01\x02\x03\x04\x05\x06\x07'
deveui = b'\x08\x09\x10\x11\x12\x13\x14\x15'
devnonce = secrets.token_bytes(2)

joinreq = struct.pack(
    '<BQQH', #use small letters if the values are signed instead of unsigned
    mhdr,
    joineui,
    deveui,
    devnonce,
)

“Q”表示长无符号(8字节)。如果您想使用float,您可以使用d来表示双浮点精度(8字节)。你知道吗

您可以看到the documentation of struct中所有字母的含义。你知道吗

相关问题 更多 >