【问题标题】:Python: binary/hex string conversion?Python:二进制/十六进制字符串转换?
【发布时间】:2010-11-17 07:16:58
【问题描述】:

我有一个同时包含二进制和字符串字符的字符串,我想先将其转换为二进制,然后再转换为十六进制。

字符串如下:

<81>^Q<81>"^Q^@^[)^G ^Q^A^S^A^V^@<83>^Cd<80><99>}^@N^@^@^A^@^@^@^@^@^@^@j

如何在 Python 中转换此字符串,以便十六进制格式的输出与下面的类似?

24208040901811001B12050809081223431235113245422F0A23000000000000000000001F

【问题讨论】:

  • 您能详细说明一下预期的翻译吗?在我看来,示例字符串和十六进制输出不是一回事...... 是单个不可打印的十六进制编码字符还是它的文本表示?我对包含二进制字符的字符串感到困惑(你是什么意思)并且你想将它转换为二进制,然后转换为十六进制......
  • 执行此操作:print(repr(your_string))) 并将结果复制/粘贴到您的问题中。告诉我们什么版本的 Python 和什么平台。

标签: python binary hex


【解决方案1】:

你可以像这样使用 ord 和 hex :

>>> s = 'some string'
>>> hex_chars = map(hex,map(ord,s))
>>> print hex_chars
['0x73', '0x6f', '0x6d', '0x65', '0x20', '0x73', '0x74', '0x72', '0x69', '0x6e', '0x67']
>>> hex_string = "".join(c[2:4] for c in hex_chars)
>>> print hex_string
736f6d6520737472696e67
>>>

或者使用内置编码:

>>> s = 'some string'
>>> print s.encode('hex_codec')
736f6d6520737472696e67
>>>

【讨论】:

  • 您的带有hexord 的版本无法可靠运行。使用 "%2.2x".__mod__ 而不是十六进制,您也可以避免使用 c[2:4]。结果它看起来像:"".join(map("%2.2x".__mod__, map(ord, s)))。编码版本当然更好。 :-)
【解决方案2】:
>>> import binascii

>>> s = '2F'

>>> hex_str = binascii.b2a_hex(s)

>>> hex_str

>>> '3246'

>>>import binascii

>>> hex_str = binascii.hexlify(s)

>>> hex_str
>>> '3246'
>>>

【讨论】:

    【解决方案3】:

    更快的解决方案参见:

    from timeit import Timer
    
    import os
    import binascii
    
    def testSpeed(statement, setup = 'pass'):
      print '%s' % statement
      print '%s' % Timer(statement, setup).timeit()
    
    setup = """
    import os
    
    value = os.urandom(32)
    """
    
    # winner
    statement = """
    import binascii
    
    binascii.hexlify(value)
    """
    
    testSpeed(statement, setup)
    
    # loser
    statement = """
    import binascii
    
    value.encode('hex_codec')
    """
    
    testSpeed(statement, setup)
    

    结果:

    import binascii
    
    binascii.hexlify(value)
    
    2.18547999816
    
    value.encode('hex_codec')
    
    2.91231595077
    

    【讨论】:

      猜你喜欢
      • 2017-05-26
      • 2023-03-04
      • 1970-01-01
      • 2017-03-22
      • 1970-01-01
      • 2019-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多