我试图将一些代码从2转换为3.我有
val = str(''.join(map(chr, list(range(0, 256, 8)))))
我需要翻译
x = str(val).encode('hex')
和
x.decode('hex')
由于
答案 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'
注意:
上面x
的python3版本是一个字节字符串。由于它完全是ASCII,因此只需通过x.decode()
即可转换为unicode。
上面python3代码中字符串末尾的val
显示与python2版本不匹配。有关创建匹配的val
的方法,请参阅下一节。
使用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'
你想要ø成为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)