【问题标题】:python string every two chars to byte - do it fast每两个字符到字节的python字符串 - 快速执行
【发布时间】:2014-01-11 00:21:08
【问题描述】:

得到一个二进制 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,但到目前为止还没有运气。

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

【问题讨论】:

  • input.decode('hex') 能提高效率吗?
  • @immortal 是的!甚至不需要 struct.unpack 和循环 :S 我的代码现在高出无数倍。谢谢!顺便说一句:你的答案应该是公认的答案,我应该如何处理?再次感谢。
  • 数百万倍更快
  • 添加为答案,很高兴它有帮助:-)

标签: python string binary


【解决方案1】:

使用binascii.unhexlify:

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

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

【讨论】:

  • 完美!谢谢,由于对 Python 3 的可移植性,甚至比 @immortal 的答案更好。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这样的事情怎么样?

    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 个为一组来表示 short 或 8 组表示为 int)。

    【讨论】:

    • @immortal 给出的答案:input.decode('hex') 对于我的用例来说要快得多(需要二进制字符串作为 PIL Image.frombuffer 的输入)。但是感谢您的回答,对于其他情况可能会派上用场。
    猜你喜欢
    • 2013-12-14
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 2019-02-22
    • 2015-11-01
    相关资源
    最近更新 更多