python 3十六进制转换

时间:2014-03-15 04:02:52

标签: python python-3.x

我试图将一些代码从2转换为3.我有

val = str(''.join(map(chr, list(range(0, 256, 8)))))

我需要翻译

x = str(val).encode('hex')

x.decode('hex')

由于

2 个答案:

答案 0 :(得分:1)

在python2中,您的代码产生:

In [4]: val = str(''.join(map(chr, list(range(0, 256, 8))))) ;  val
Out[4]: '\x00\x08\x10\x18 (08@HPX`hpx\x80\x88\x90\x98\xa0\xa8\xb0\xb8\xc0\xc8\xd0\xd8\xe0\xe8\xf0\xf8'
In [5]: x = str(val).encode('hex') ; x
Out[5]: '0008101820283038404850586068707880889098a0a8b0b8c0c8d0d8e0e8f0f8'
In [6]: x.decode('hex')
Out[6]: '\x00\x08\x10\x18 (08@HPX`hpx\x80\x88\x90\x98\xa0\xa8\xb0\xb8\xc0\xc8\xd0\xd8\xe0\xe8\xf0\xf8'

要在python3中获得类似的输出:

In [19]: import codecs
In [20]: val = ''.join(map(chr, range(0, 256, 8))) ; val
Out[20]: '\x00\x08\x10\x18 (08@HPX`hpx\x80\x88\x90\x98\xa0¨°¸ÀÈÐØàèðø'
In [21]: x = codecs.encode(val.encode('latin-1'), 'hex_codec') ; x
Out[21]: b'0008101820283038404850586068707880889098a0a8b0b8c0c8d0d8e0e8f0f8'
In [22]: codecs.decode(x, 'hex_codec')
Out[22]: b'\x00\x08\x10\x18 (08@HPX`hpx\x80\x88\x90\x98\xa0\xa8\xb0\xb8\xc0\xc8\xd0\xd8\xe0\xe8\xf0\xf8'

注意:

  1. 上面x的python3版本是一个字节字符串。由于它完全是ASCII,因此只需通过x.decode()即可转换为unicode。

  2. 上面python3代码中字符串末尾的val显示与python2版本不匹配。有关创建匹配的val的方法,请参阅下一节。

  3. 替代

    使用bytes创建字符串。使用binascii.hexlify将其转换为十六进制:

    In [15]: val = bytes(range(0, 256, 8))
    In [16]: val
    Out[16]: b'\x00\x08\x10\x18 (08@HPX`hpx\x80\x88\x90\x98\xa0\xa8\xb0\xb8\xc0\xc8\xd0\xd8\xe0\xe8\xf0\xf8'
    In [17]: binascii.hexlify(val)
    Out[17]: b'0008101820283038404850586068707880889098a0a8b0b8c0c8d0d8e0e8f0f8'
    


    有关unicode和字符0xf8

    的更多信息

    你想要ø成为0xf8。以下是如何使这项工作:

    >>> s = chr( int('f8', 16) )
    >>> s
    'ø'
    

    并且,要将s转换回十六进制数字:

    >>> hex(ord(s))
    '0xf8'
    

    注意,0xf8'是'ø'的unicode代码点,并且与表示unicode字符'ø'的字节字符串不同,它是:

    >>> s.encode('utf8')
    b'\xc3\xb8'
    

    因此,'ø'是unicode集中的第248个(0xf8)字符,其字节字符串表示为b'\ xc3 \ xb8'。

答案 1 :(得分:0)

您的Python 2代码:

val = str(''.join(map(chr, list(range(0, 256, 8)))))
x = str(val).encode('hex')
x.decode('hex')

让我们的版本适用于Python 2和3:

import binascii

val = bytearray(range(0, 0x100, 8))
x = binascii.hexlify(val)
binascii.unhexlify(x)