【问题标题】:Python 3.1.1 string to hexPython 3.1.1 字符串转十六进制
【发布时间】:2011-01-21 08:53:55
【问题描述】:

我正在尝试使用str.encode(),但我得到了

>>> "hello".encode(hex)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: must be string, not builtin_function_or_method

我尝试了很多变体,它们似乎都在 Python 2.5.2 中工作,那么我需要做些什么才能让它们在 Python 3.1 中工作?

【问题讨论】:

    标签: python string python-3.x hex


    【解决方案1】:

    hex 编解码器已在 3.x 中被丢弃。请改用binascii

    >>> binascii.hexlify(b'hello')
    b'68656c6c6f'
    

    【讨论】:

    • 顺便说一句,二进制代码在 3.2 版本中卷土重来,see docs
    • 如果我的字符串存储在变量中怎么办?
    • 这会报错,因为参数必须是字节类对象。
    • 要将字符串转换为二进制序列,您可以使用“.encode()”。示例:“这是你的字符串”.encode()
    【解决方案2】:

    在 Python 3.5+ 中,将字符串编码为字节并使用 hex() 方法,返回一个字符串。

    s = "hello".encode("utf-8").hex()
    s
    # '68656c6c6f'
    

    可选择将字符串转换回字节:

    b = bytes(s, "utf-8")
    b
    # b'68656c6c6f'
    

    【讨论】:

    • 这是对 Python 3 字符串变量执行此操作的方法。这里的很多答案都是关于常量的。很少有实用的代码。
    • 如果你想使用hex(),请强调>=Python 3.5
    【解决方案3】:

    你已经得到了一些很好的答案,但我想你可能也对一些背景感兴趣。

    首先,您缺少引号。应该是:

    "hello".encode("hex")
    

    其次,此编解码器尚未移植到 Python 3.1。见here。似乎他们还没有决定这些编解码器是否应该包含在 Python 3 中或以不同的方式实现。

    如果您查看附加到该错误的diff file,您可以看到建议的实现方法:

    import binascii
    output = binascii.b2a_hex(input)
    

    【讨论】:

      【解决方案4】:

      顺便说一句,binascii 方法更简单

      >>> import binascii
      >>> x=b'test'
      >>> x=binascii.hexlify(x)
      >>> x
      b'74657374'
      >>> y=str(x,'ascii')
      >>> y
      '74657374'
      >>> x=binascii.unhexlify(x)
      >>> x
      b'test'
      >>> y=str(x,'ascii')
      >>> y
      'test'
      

      希望对您有所帮助。 :)

      【讨论】:

      • binascii 也比其他方法更快。刚刚用 timeit 测试过。
      • 如果字符串是常规的 Python 3 字符串,而不是二进制或常量,你如何进行字符串到十六进制的转换?
      【解决方案5】:

      在 Python 3.5 及更高版本中最简单的方法是:

      >>> 'halo'.encode().hex()
      '68616c6f'
      

      如果您使用 utf-8 字符手动将字符串输入 Python 解释器,您可以通过在字符串前输入 b 来更快地完成:

      >>> b'halo'.hex()
      '68616c6f'
      

      在 Python 2.x 中等效:

      >>> 'halo'.encode('hex')
      '68616c6f'
      

      【讨论】:

      • 感谢@ner0 的重要评论!
      • 不用担心。如果需要 v3.4 或更低版本,则可以:from binascii import hexlify str(hexlify(bytes('halo', encoding = 'utf-8')), 'ascii')
      【解决方案6】:

      在 Python 3 中,所有字符串都是 unicode。通常,如果将 unicode 对象编码为字符串,则使用.encode('TEXT_ENCODING'),因为hex 不是文本编码,因此应使用codecs.encode() 来处理任意编解码器。例如:

      >>>> "hello".encode('hex')
      LookupError: 'hex' is not a text encoding; use codecs.encode() to handle arbitrary codecs
      >>>> import codecs
      >>>> codecs.encode(b"hello", 'hex')
      b'68656c6c6f'
      

      同样,由于“hello”是 unicode,因此您需要在编码为十六进制之前将其表示为字节字符串。这可能更符合您使用 encode 方法的原始方法。

      binascii.hexlifycodecs.encode的区别如下:

      • binascii.hexlify

        二进制数据的十六进制表示。

        返回值是一个字节对象。

        类型:builtin_function_or_method

      • codecs.encode

        encode(obj, [encoding[,errors]]) -> 对象

        使用为编码注册的编解码器对 obj 进行编码。编码默认值 为默认编码。可能会给出错误以设置不同的错误 处理方案。默认为“严格”,表示编码错误会引发 一个值错误。其他可能的值是“忽略”、“替换”和 'xmlcharrefreplace' 以及任何其他注册的名称 可以处理 ValueErrors 的 codecs.register_error。

        类型:builtin_function_or_method

      【讨论】:

        【解决方案7】:

        base64.b16encodebase64.b16decode 将字节转换为十六进制,并适用于所有 Python 版本。 codecs approach 也有效,但在 Python 3 中不太直接。

        【讨论】:

        • 这正是我所需要的!一种跨 python 版本的十六进制编码和解码方式。谢谢^_^ &gt;&gt;&gt; import base64 &gt;&gt;&gt; key = base64.b16encode(b'0123456789abcdef') &gt;&gt;&gt; base64.b16decode(key) '0123456789abcdef'
        【解决方案8】:

        【讨论】:

        • 它比“hexlificationize”短:^)
        【解决方案9】:

        另一种方法:

        s = 'hello'
        
        h = ''.join([hex(ord(i)) for i in s]);
        
        # outputs: '0x680x650x6c0x6c0x6f'
        

        这基本上将字符串拆分为字符,通过hex(ord(char)) 进行转换,然后将字符重新连接在一起。如果您想要不带前缀 0x 的结果,请执行以下操作:

        h = ''.join([str(hex(ord(i)))[2:4] for i in s]);
        
        # outputs: '68656c6c6f'
        

        使用 Python 3.5.3 测试。

        【讨论】:

          猜你喜欢
          • 2012-08-15
          • 2015-05-30
          • 1970-01-01
          • 2010-11-17
          • 1970-01-01
          • 2020-06-20
          • 2018-01-31
          • 2017-03-22
          • 1970-01-01
          相关资源
          最近更新 更多