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

时间:2014-05-09 01:11:06

标签: python

我正在寻找能够做到的功能:

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

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

参数:

  • size:字符串的len
  • value:要转换为十六进制字符串的值

是否有内置功能可以做到这一点。 如果不是,那怎么可以轻松完成。

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

chr(0xab) = '\xab'

2 个答案:

答案 0 :(得分:1)

您可以先使用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字节,则可以使用struct 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'

答案 1 :(得分:-1)

作为一个单行:

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