Jaki jest prawidłowy sposób konwersji bajtów na ciąg szesnastkowy w Pythonie 3?

Jaki jest prawidłowy sposób konwersji bajtów na ciąg szesnastkowy w Pythonie 3?

Widzę twierdzenia o metodzie bytes.hex, kodekach bytes.decode i wypróbowałem Inne możliwe funkcje najmniej zaskakujące bez skutku. Chcę tylko moje bajty jako hex!

Author: agf, 2011-07-08

9 answers

Od Pythona 3.5 to w końcu nie jest już niewygodne:

>>> b'\xde\xad\xbe\xef'.hex()
'deadbeef'

I odwrotnie:

>>> bytes.fromhex('deadbeef')
b'\xde\xad\xbe\xef'

Działa również z zmiennym typem bytearray.

Odniesienie: https://docs.python.org/3/library/stdtypes.html#bytes.hex

 477
Author: Felix Weis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-24 13:11:04

Użyj modułu binascii:

>>> import binascii
>>> binascii.hexlify('foo'.encode('utf8'))
b'666f6f'
>>> binascii.unhexlify(_).decode('utf8')
'foo'

Zobacz tę odpowiedź: Python 3.1.1 string to hex

 97
Author: Mu Mind,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:32

Python ma standardowe kodeki , które wykonują wygodne przekształcenia, takie jak quoted-printable (pasuje do 7-bitowych ascii), base64 (pasuje do alfanumerycznych), hex escaping, GZIP i kompresja bz2. W Pythonie 2 można zrobić:

b'foo'.encode('hex')

W Pythonie 3, str.encode / bytes.decode są ściśle dla bajtów konwersji str. Zamiast tego możesz to zrobić, co działa w Pythonie 2 i Pythonie 3 (s/encode/decode/g dla odwrotności):

import codecs
codecs.getencoder('hex')(b'foo')[0]

Począwszy od Pythona 3.4, jest mniej niezręczna opcja:

codecs.encode(b'foo', 'hex')

Te różne kodeki są również dostępne wewnątrz własnych modułów (base64, Zlib, bz2, UU, quopri, binascii); API jest mniej spójne, ale dla kodeków kompresji oferuje większą kontrolę.

 45
Author: Gabriel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-19 21:53:01

Metoda binascii.hexlify() przekonwertuje bytes na bytes reprezentujący łańcuch szesnastkowy ascii. Oznacza to, że każdy bajt na wejściu zostanie przekonwertowany na dwa znaki ascii. Jeśli chcesz uzyskać prawdziwy str, możesz .decode("ascii") uzyskać wynik.

Dodałem fragment, który to ilustruje.

import binascii

with open("addressbook.bin", "rb") as f: # or any binary file like '/bin/ls'
    in_bytes = f.read()
    print(in_bytes) # b'\n\x16\n\x04'
    hex_bytes = binascii.hexlify(in_bytes) 
    print(hex_bytes) # b'0a160a04' which is twice as long as in_bytes
    hex_str = hex_bytes.decode("ascii")
    print(hex_str) # 0a160a04

Od ciągu sześciokątnego "0a160a04" do może wrócić do bytes z binascii.unhexlify("0a160a04"), co daje b'\n\x16\n\x04'

 9
Author: RubenLaguna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-09 09:28:38
import codecs
codecs.getencoder('hex_codec')(b'foo')[0]

Działa w Pythonie 3.3 (czyli "hex_codec" zamiast "hex").

 7
Author: Richard Kiss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-27 12:19:06

Nowość w Pythonie 3.8, możesz przekazać argument ogranicznika do funkcji hex, Jak w tym przykładzie

>>> value = b'\xf0\xf1\xf2'
>>> value.hex('-')
'f0-f1-f2'
>>> value.hex('_', 2)
'f0_f1f2'
>>> b'UUDDLRLRAB'.hex(' ', -4)
'55554444 4c524c52 4142'

Https://docs.python.org/3/library/stdtypes.html#bytes.hex

 5
Author: Peter Mitrano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-03 08:05:52

Ok, następująca odpowiedź jest nieco poza zakresem, jeśli zależy Ci tylko na Pythonie 3, ale to pytanie jest pierwszym hitem Google, nawet jeśli nie podasz wersji Pythona, więc oto sposób, który działa zarówno na Pythonie 2 i Python 3.

Interpretuję również pytanie o konwersję bajtów na typ str: czyli bajty-y w Pythonie 2 i Unicode-y w Pythonie 3.

Biorąc pod uwagę, że najlepsze podejście, jakie znam, to:

import six

bytes_to_hex_str = lambda b: ' '.join('%02x' % i for i in six.iterbytes(b))

Następujące twierdzenie będzie true dla Pythona 2 lub Pythona 3, zakładając, że nie aktywowałeś unicode_literals future w Pythonie 2:

assert bytes_to_hex_str(b'jkl') == '6a 6b 6c'

(lub możesz użyć ''.join(), Aby pominąć odstęp między bajtami itp.)

 3
Author: Peter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-16 17:57:56

Może być użyty specyfikator formatu %x02 tego formatu i wypisać wartość szesnastkową. Na przykład:

>>> foo = b"tC\xfc}\x05i\x8d\x86\x05\xa5\xb4\xd3]Vd\x9cZ\x92~'6"
>>> res = ""
>>> for b in foo:
...     res += "%02x" % b
... 
>>> print(res)
7443fc7d05698d8605a5b4d35d56649c5a927e2736
 3
Author: Arg0s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-10 16:03:21

Jeśli chcesz przekonwertować b '\x61 'na 97 lub '0x61', możesz spróbować tego:

[python3.5]
>>>from struct import *
>>>temp=unpack('B',b'\x61')[0] ## convert bytes to unsigned int
97
>>>hex(temp) ##convert int to string which is hexadecimal expression
'0x61'

Odniesienie: https://docs.python.org/3.5/library/struct.html

 0
Author: hao li,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-08 14:59:12