python字符串每两个字符转换一个字节-快速完成

python字符串每两个字符转换一个字节-快速完成,python,string,binary,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,速度会变得不可接受,有时事件会抛出Memor

得到一个二进制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,但到目前为止运气不好


有什么办法加快速度吗?

像这样的怎么样

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")
def chrToInt(c):
如果c>='0'和c='A'和c给出
输入。解码('hex')
A尝试:)

使用内置解决方案始终是一个好主意使用:


(在Python2中,您可以使用进行解码,但这对于Python3来说是不可移植的。)

输入的可能重复。解码('hex')可以提高您的效率吗?@YES!甚至不需要struct.unpack和循环:我的代码现在高出了数不清的系数。谢谢顺便说一句:你的答案应该是公认的答案,我该如何处理?再次感谢。factor zillion fasterAdded作为答案,很高兴它有帮助:-)答案@personal给出:
input.decode('hex')
对于我的用例来说要快得多(需要二进制字符串作为PIL Image.frombuffer的输入)。谢谢你的回答,其他情况下也可以用。太好了!谢谢,比@personal的答案更好,因为它可以移植到Python3。
>>> import binascii
>>> binascii.unhexlify('AB02CF4AFF')
b'\xab\x02\xcfJ\xff'