【问题标题】:Convert from ASCII string encoded in Hex to plain ASCII?从以十六进制编码的 ASCII 字符串转换为纯 ASCII?
【发布时间】:2012-03-27 08:09:12
【问题描述】:

如何在 Python 中将十六进制转换为纯 ASCII?

请注意,例如,我想将“0x7061756c”转换为“paul”。

【问题讨论】:

  • 我已经尝试了很多我在这里找到的东西:docs.python.org/library/binascii.html
  • 借助您刚刚给我们的链接,我找到了您正在寻找的功能。您究竟尝试了什么?为什么没有成功?
  • 我尝试了以下方法: >>> binascii.b2a_hqx("0x7061756c") '-(Jh-$Ba0c8fB`' >>​​> binascii.b2a_uu("0x7061756c") "*,'@W ,#8Q-S4V8P \n" >>> binascii.b2a_base64("0x7061756c") 'MHg3MDYxNzU2Yw==\n' >>> binascii.b2a_qp("0x7061756c") '0x7061756c' >>> binascii.b2a_hex("0x7061756c" ) '30783730363137353663' >>> binascii.b2a_hex(0x7061756c) Traceback(最近一次调用最后):文件“”,第 1 行,在 类型错误:必须是字符串或缓冲区,而不是 int >>>跨度>
  • 它们都不起作用,因为它们都没有返回“paul”。
  • 你不是说“7位”ASCII吗? (这有点傻,因为 ASCII 只有 7 位。) GUID 是 128 位...

标签: python hex ascii


【解决方案1】:

一个稍微简单的解决方案:

>>> "7061756c".decode("hex")
'paul'

【讨论】:

  • Python 3 上没有 .decode('hex').decode('hex') uses binascii.unhexlify() on Python 2
  • 感谢您指出这一点,我对 Python 3 不太熟悉。据我所知,此解决方案在 1 中也不起作用。
  • codecs.decode("7061756c", "hex") 适用于 Python 2 和 Python 3。但它在 Python 3 中返回 bytes() 字符串。但这对于 ASCII 字符串是合理的。
【解决方案2】:

无需导入任何库:

>>> bytearray.fromhex("7061756c").decode()
'paul'

【讨论】:

  • 对我来说最好的解决方案(适用于 python 3),因为它甚至可以接受空格:bytearray.fromhex("70 61 75 6C").decode()
  • bytearray.fromhex("70e4756c").decode(encoding="Latin1") 'päul' 对于我们这些玩二进制的人来说,扩展字符会在默认的 utf-8 解码中阻塞,除了那,这是我看到的最便携的答案!谢谢!
  • 当然,如果要将数据解释为文本,您必须知道数据的实际编码。使用 'latin-1' 将消除任何错误,但如果文本实际上不是 Latin-1,则很可能会产生完全的乱码。
  • 在解释器中,即使是在没有.decode() 的情况下返回的bytearrayrepr 也是人类可读的,因此为了快速检查某些内容,您可能会在没有.decode() 的情况下逃脱。
  • 或更好的 bytes.fromhex("7061756c").decode() 因为您不需要可变数组,而且输入更少。
【解决方案3】:
>>> txt = '7061756c'
>>> ''.join([chr(int(''.join(c), 16)) for c in zip(txt[0::2],txt[1::2])])
'paul'                                                                          

我只是玩得开心,但重要的部分是:

>>> int('0a',16)         # parse hex
10
>>> ''.join(['a', 'b'])  # join characters
'ab'
>>> 'abcd'[0::2]         # alternates
'ac'
>>> zip('abc', '123')    # pair up
[('a', '1'), ('b', '2'), ('c', '3')]        
>>> chr(32)              # ascii to character
' '

现在将研究 binascii...

>>> print binascii.unhexlify('7061756c')
paul

很酷(我不知道为什么其他人想在他们提供帮助之前让你跳槽)。

【讨论】:

    【解决方案4】:

    在 Python 2 中:

    >>> "7061756c".decode("hex")
    'paul'
    

    在 Python 3 中:

    >>> bytes.fromhex('7061756c').decode('utf-8')
    'paul'
    

    【讨论】:

      【解决方案5】:
      b''.fromhex('7061756c')
      

      使用不带分隔符

      【讨论】:

      • 这与bytes.fromhex()bytearray.fromhex() 没有区别。对于这两种类型,.fromhex() 是一个类方法。
      【解决方案6】:

      这是我使用十六进制整数而不是十六进制字符串时的解决方案:

      def convert_hex_to_ascii(h):
          chars_in_reverse = []
          while h != 0x0:
              chars_in_reverse.append(chr(h & 0xFF))
              h = h >> 8
      
          chars_in_reverse.reverse()
          return ''.join(chars_in_reverse)
      
      print convert_hex_to_ascii(0x7061756c)
      

      【讨论】:

      • +1 是一个有用的示例,但您没有将“十六进制”转换为输入,而是将任何整数转换为十六进制字符串。您的代码同样适用于print convert_hex_to_ascii(123456)
      【解决方案7】:

      在 Python 3.3.2 中测试 有很多方法可以做到这一点,这是最短的一种,只使用 python 提供的东西:

      import base64
      hex_data ='57696C6C20796F7520636F6E76657274207468697320484558205468696E6720696E746F20415343494920666F72206D653F2E202E202E202E506C656565656173652E2E2E212121'
      ascii_string = str(base64.b16decode(hex_data))[2:-1]
      print (ascii_string)
      

      当然,如果您不想导入任何内容,您可以随时编写自己的代码。像这样非常基本的东西:

      ascii_string = ''
      x = 0
      y = 2
      l = len(hex_data)
      while y <= l:
          ascii_string += chr(int(hex_data[x:y], 16))
          x += 2
          y += 2
      print (ascii_string)
      

      【讨论】:

        【解决方案8】:

        或者,您也可以这样做......

        Python 2 解释器

        print "\x70 \x61 \x75 \x6c"
        

        例子

        user@linux:~# python
        Python 2.7.14+ (default, Mar 13 2018, 15:23:44) 
        [GCC 7.3.0] on linux2
        Type "help", "copyright", "credits" or "license" for more information.
        
        >>> print "\x70 \x61 \x75 \x6c"
        p a u l
        >>> exit()
        user@linux:~# 
        

        Python 2 单线器

        python -c 'print "\x70 \x61 \x75 \x6c"'
        

        例子

        user@linux:~# python -c 'print "\x70 \x61 \x75 \x6c"'
        p a u l
        user@linux:~# 
        

        Python 3 解释器

        user@linux:~$ python3
        Python 3.6.9 (default, Apr 18 2020, 01:56:04) 
        [GCC 8.4.0] on linux
        Type "help", "copyright", "credits" or "license" for more information.
        
        >>> print("\x70 \x61 \x75 \x6c")
        p a u l
        
        >>> print("\x70\x61\x75\x6c")
        paul
        

        Python 3 单线器

        python -c 'print("\x70 \x61 \x75 \x6c")'
        

        例子

        user@linux:~$ python -c 'print("\x70 \x61 \x75 \x6c")'
        p a u l
        
        user@linux:~$ python -c 'print("\x70\x61\x75\x6c")'
        paul
        

        【讨论】:

        • 这在没有空格的情况下也可以正常工作,并且在 python3 中使用 print() 也可以正常工作。
        • 是的,我放它是为了让它更容易看到。让我也用 Python 3 更新答案。
        【解决方案9】:

        无需导入任何东西,试试这个简单的代码示例如何将任何十六进制转换为字符串

        python hexit.py
        Hex it>>some string
        
        
         736f6d6520737472696e67
        
        python tohex.py
        Input Hex>>736f6d6520737472696e67
        some string
        cat tohex.py
        
        
        s=input("Input Hex>>")
        b=bytes.fromhex(s)
        print(b.decode())
        

        【讨论】:

        • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 2015-05-22
        • 1970-01-01
        • 2011-11-21
        • 1970-01-01
        • 2011-10-26
        • 2018-08-12
        • 2018-08-25
        • 2011-06-14
        相关资源
        最近更新 更多