python字符串每两个字符到字节 - 快速执行

时间:2013-12-22 18:05:38

标签: python string binary

获得二进制blob字符串,如:

input = "AB02CF4AFF"

每对“AB”,“02”,“CF”,“4A”,“FF”构成一个字节。 我这样做:

data = StringIO()
for j in range(0, len(input)/2):
    bit = input[j*2:j*2+2]
    data.write('%c' % int(bit,16))
data.seek(0)

工作正常,但是对于大型二进制blob,这变得无法接受,有时候事件会引发MemoryError。

想到了struct.unpack,但到目前为止还没有运气。

有什么方法可以加快速度吗?

3 个答案:

答案 0 :(得分:4)

使用binascii.unhexlify

>>> import binascii
>>> binascii.unhexlify('AB02CF4AFF')
b'\xab\x02\xcfJ\xff'

(在Python 2中,您可以使用hex codec进行解码,但这不能移植到Python 3。)

答案 1 :(得分:3)

尝试input.decode('hex'):)

使用内置解决方案总是一个好主意

答案 2 :(得分:1)

这样的事情怎么样?

def chrToInt(c):
    if c >= '0' and c <= '9':
        return int(ord(c) - ord('0'))
    elif c >= 'A' and c <= 'F':
        return int(ord(c) - ord('A')) + 10
    else:
        # invalid hex character, throw an exception or something here
        return None

def hexToBytes(input):
    bytes = []

    for i in range(0, len(input) - 1, 2):
        val = (chrToInt(input[i]) * 16) + chrToInt(input[i + 1])

        bytes.append(val)

    return bytes

print hexToBytes("AB02CF4AFF")

你可以通过使用二进制操作使chrToInt无分支来加速它,你也可以修改hexToBytes来确切地说明如果你想要使用大于字节的东西它应该读取多少个字符(所以它返回它以4个为一组的短数组或8个用于int的组。)