用于将整数列表转换为十六进制表示的函数

时间:2013-03-18 17:07:45

标签: python hex

我的函数hex2int如下:

import binascii

def hex2int(hexdata):
    return [ord(c) for c in binascii.unhexlify(hexdata)]

会变成像

这样的字符串
'000000000000000000030c1a314a616d72614d331f0e0603010100000000000000010101010000010305060502000000021c4179b1dcedd2a76e41210e0906040403020202020100020825528dcdf2ffe0a86f3b22130c0a08060402000000000001010203020100000000000000000000000000000203030200000000020307142c5584a8bba37c4e28160c080603000000000000000001010101010101010101000000000000000d285c93c5dac7a06c4226160f0a0704030303030403030100000000000000000002030405040301000000000000000000000000000000000000000000000007111c2732404d5a61675f5342322118100d0a080604020100'

进入以下列表:

[0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 12, 26, 49, 74, 97, 109, 114, 97, 77, 51, 31, 14, 6, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 3, 5, 6, 5, 2, 0, 0, 0, 2, 28, 65, 121, 177, 220, 237, 210, 167, 110, 65, 33, 14, 9, 6, 4, 4, 3, 2, 2, 2, 2, 1, 0, 2, 8, 37, 82, 141, 205, 242, 255, 224, 168, 111, 59, 34, 19, 12, 10, 8, 6, 4, 2, 0, 0, 0, 0, 0, 1, 1, 2, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 2, 0, 0, 0, 0, 2, 3, 7, 20, 44, 85, 132, 168, 187, 163, 124, 78, 40, 22, 12, 8, 6, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 13, 40, 92, 147, 197, 218, 199, 160, 108, 66, 38, 22, 15, 10, 7, 4, 3, 3, 3, 3, 4, 3, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 4, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 17, 28, 39, 50, 64, 77, 90, 97, 103, 95, 83, 66, 50, 33, 24, 16, 13, 10, 8, 6, 4, 2, 1, 0]

我正在尝试编写反函数int2hex,它接受​​此列表并返回第一个字符串。

我目前有

def int2hex(intdata):
    return binascii.hexlify(''.join([hex(i) for i in intdata]))

但是这不会返回正确的结果。你能解释我哪里出错吗?

4 个答案:

答案 0 :(得分:4)

只需使用format()

''.join(format(my_int, '02x') for my_int in my_list)

将每个整数值格式化为2位小写十六进制值,如果值小于16,则前导0。

答案 1 :(得分:4)

不理解Python 2.7 +:

binascii.hexlify(bytearray(my_list))

在Python 2.6上,它需要一个'readonly'缓冲区,与bytearray不同。:

binascii.hexlify(buffer(bytearray(my_list)))

答案 2 :(得分:3)

print ''.join("%02x"%my_int for my_int in my_list)

答案 3 :(得分:1)

这里有一些很好的答案可以解决你遇到的问题,但不解释你为什么会这样做。

运行时

 >>> binascii.unhexlify(hexdata)
 '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x0c\x1a1JamraM3\x1f\x0e\x06\x03x01\x01x00x00x00x00\x00\x00\x00\x01\x01\x01\x01\x00\x00\x01\x03\x05\x06\x05\x02\x00\x00x00x02x1cAy\xb1\xdc\xed\xd2\xa7nA!\x0e\t\x06\x04\x04\x03\x02\x02\x02\x02\x01\x00x02x08%Rx8d\xcd\xf2\xff\xe0\xa8o;"\x13\x0c\n\x08\x06\x04\x02\x00\x00\x00x00x00x01x01x02\x03\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00x00x02x03x03\x02\x00\x00\x00\x00\x02\x03\x07\x14,U\x84\xa8\xbb\xa3|N(\x16x0cx08x06x03x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01x01x01x01\x00x00x00\x00\x00\x00\x00\r(\\\x93\xc5\xda\xc7\xa0lB&\x16\x0f\n\x07x04x03\x03\x03x03x04\x03\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x03\x04\x05'\x04\x03x01x00x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00x00x00\x00\x07\x11\x1c\'2@MZag_SB2!\x18\x10\r\n\x08\x06\x04\x02\x01\x00'

你得到一个字符串,其中每个字符的二进制值是你想要的数字(因此'\x00',这就是你使用ord()的原因

但是,你正在运行

 >> ''.join([hex(i) for i in intdata])
 '0x00x00x00x00x00x00x00x00x00x30xc0x1a0x310x4a0x610x6d0x720x610x4d0x330x1f0xe0x60x30x10x10x00x00x00x00x00x00x00x10x10x10x10x00x00x10x30x50x60x50x20x00x00x00x20x1c0x410x790xb10xdc0xed0xd20xa70x6e0x410x210xe0x90x60x40x40x30x20x20x20x20x10x00x20x80x250x520x8d0xcd0xf20xff0xe00xa80x6f0x3b0x220x130xc0xa0x80x60x40x20x00x00x00x00x00x10x10x20x30x20x10x00x00x00x00x00x00x00x00x00x00x00x00x00x00x20x30x30x20x00x00x00x00x20x30x70x140x2c0x550x840xa80xbb0xa30x7c0x4e0x280x160xc0x80x60x30x00x00x00x00x00x00x00x00x10x10x10x10x10x10x10x10x10x10x00x00x00x00x00x00x00xd0x280x5c0x930xc50xda0xc70xa00x6c0x420x260x160xf0xa0x70x40x30x30x30x30x40x30x30x10x00x00x00x00x00x00x00x00x00x20x30x40x50x40x30x10x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x70x110x1c0x270x320x400x4d0x5a0x610x670x5f0x530x420x320x210x180x100xd0xa0x80x60x40x20x10x0'

这给你一个ascii表示。您需要使用chr()以您的方式执行此操作,或者使用其中一个其他答案中的其中一个替代方案。