如何将无符号值转换为字节字符串

2024-05-16 20:13:28 发布

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

我正在寻找一个功能谁做:

def unsignedToByteString(size, value):
  // ...
  return output

unsignedToByteString(2, 0x5678) = '\x56\x78'
unsignedToByteString(4,   1234) = '\x00\x00\x04\xd2'

参数:

  • 大小:字符串长度
  • value:要转换为十六进制字符串的值

有没有什么内置函数可以做到这一点。 如果不是的话,那怎么容易做到。你知道吗

更新:我发现chr函数的值小于126到一个十六进制字符。(我想我可以用它来建立一个字符串)

chr(0xab) = '\xab'

Tags: 函数字符串功能outputsizereturnvaluedef
2条回答

您可以从使用hex函数开始。它将1234输入转换成'0x4d2'0x5678将保持'0x5678'。然后可以使用zfill方法将其设置为所需的大小。剩下的就是在上面使用decode('hex')。代码如下:

def unsignedToHexaString(size, value):
    output = hex(value)
    output = output[2:].zfill(size*2)
    return output.decode('hex')

如果值适合1、2、4或8个字节,则可以使用^{} module

>>> import struct
>>> struct.pack('H', 0x5678)
b'xV'
>>> struct.pack('H', 0xbeef)
b'\xef\xbe'
>>> struct.pack('!H', 0xbeef) # big-endian byte order
b'\xbe\xef'
>>> struct.pack('!L', 0xbeef)
b'\x00\x00\xbe\xef'

如果你需要编码更大的值,你必须自己把它分成更小的块。例如,对于128位:

>>> struct.pack('!QQ', *divmod(0xdeadbeef0cafe0deadbeef, 2**64))
b'\x00\x00\x00\x00\x00\xde\xad\xbe\xef\x0c\xaf\xe0\xde\xad\xbe\xef'

作为一行:

unsignedToHexaString = lambda s, v: (("%%0%dx" % (s * 2)) % v).decode("hex")

相关问题 更多 >