Python 3.1.1 string to hex

前端 未结 9 914
野的像风
野的像风 2020-11-28 04:59

I am trying to use str.encode() but I get

>>> \"hello\".encode(hex)
Traceback (most recent call last):
  File \"\", line 1         


        
相关标签:
9条回答
  • 2020-11-28 05:34

    Yet another method:

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

    This basically splits the string into chars, does the conversion through hex(ord(char)), and joins the chars back together. In case you want the result without the prefix 0x then do:

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

    Tested with Python 3.5.3.

    0 讨论(0)
  • 2020-11-28 05:39

    You've already got some good answers, but I thought you might be interested in a bit of the background too.

    Firstly you're missing the quotes. It should be:

    "hello".encode("hex")
    

    Secondly this codec hasn't been ported to Python 3.1. See here. It seems that they haven't yet decided whether or not these codecs should be included in Python 3 or implemented in a different way.

    If you look at the diff file attached to that bug you can see the proposed method of implementing it:

    import binascii
    output = binascii.b2a_hex(input)
    
    0 讨论(0)
  • 2020-11-28 05:40

    The hex codec has been chucked in 3.x. Use binascii instead:

    >>> binascii.hexlify(b'hello')
    b'68656c6c6f'
    
    0 讨论(0)
  • 2020-11-28 05:40

    The easiest way to do it in Python 3.5 and higher is:

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

    If you manually enter a string into a Python Interpreter using the utf-8 characters, you can do it even faster by typing b before the string:

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

    Equivalent in Python 2.x:

    >>> 'halo'.encode('hex')
    '68616c6f'
    
    0 讨论(0)
  • 2020-11-28 05:40

    base64.b16encode and base64.b16decode convert bytes to and from hex and work across all Python versions. The codecs approach also works, but is less straightforward in Python 3.

    0 讨论(0)
  • 2020-11-28 05:43

    In Python 3, all strings are unicode. Usually, if you encode an unicode object to a string, you use .encode('TEXT_ENCODING'), since hex is not a text encoding, you should use codecs.encode() to handle arbitrary codecs. For example:

    >>>> "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'
    

    Again, since "hello" is unicode, you need to indicate it as a byte string before encoding to hexadecimal. This may be more inline with what your original approach of using the encode method.

    The differences between binascii.hexlify and codecs.encode are as follow:

    • binascii.hexlify

      Hexadecimal representation of binary data.

      The return value is a bytes object.

      Type: builtin_function_or_method

    • codecs.encode

      encode(obj, [encoding[,errors]]) -> object

      Encodes obj using the codec registered for encoding. encoding defaults to the default encoding. errors may be given to set a different error handling scheme. Default is 'strict' meaning that encoding errors raise a ValueError. Other possible values are 'ignore', 'replace' and 'xmlcharrefreplace' as well as any other name registered with codecs.register_error that can handle ValueErrors.

      Type: builtin_function_or_method

    0 讨论(0)
提交回复
热议问题