我正在寻找能够做到的功能:
def unsignedToByteString(size, value):
// ...
return output
unsignedToByteString(2, 0x5678) = '\x56\x78'
unsignedToByteString(4, 1234) = '\x00\x00\x04\xd2'
参数:
是否有内置功能可以做到这一点。 如果不是,那怎么可以轻松完成。
更新:我发现chr
函数的值小于126到十六进制字符。 (我想我可以用它来构建一个字符串)
chr(0xab) = '\xab'
答案 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")