Jaki jest prawidłowy sposób konwersji bajtów na ciąg szesnastkowy w Pythonie 3?
Widzę roszczenia do bytes.hex
metody, bytes.decode
kodeków i wypróbowałem inne możliwe funkcje najmniejszego zdziwienia bezskutecznie. Chcę tylko moje bajty jako hex!
python
python-3.x
hex
Matt Joiner
źródło
źródło
Odpowiedzi:
Od wersji Python 3.5 nie jest to już niewygodne:
i odwróć:
działa również z
bytearray
typem zmiennym .Odniesienie: https://docs.python.org/3/library/stdtypes.html#bytes.hex
źródło
bytes.fromhex()
jest również dostępny w Python 3.0+ (nie tylko 3.5+).bytes.hex()
jest tylko w Python 3.5+.Użyj
binascii
modułu:Zobacz następującą odpowiedź: Ciąg w Pythonie 3.1.1 na szesnastkę
źródło
str
alebytes
. Wiem, że OP wydaje się być zadowolony z odpowiedzi, ale nie będzie lepiej rozszerzyć tę odpowiedź, aby objąć.decode("ascii")
ją również „ciągiem”bytes
. Jeśliprint(b'666f6f')
dostanieszb
na wydruku. Jeśli nie.decode("ascii")
, to nie. Wystarczy pomyśleć o tym, jak ci, którzy faktycznie mielibytes
(prawdziwy plik binarny z elementami> 128, a nie ciąg ascii), chcieli go wydrukować..hex()
w Python 3.5+ istnieje metodaPython ma standardowe kodeki bajt-bajt, które wykonują wygodne transformacje, takie jak drukowanie w cudzysłowie (pasuje do 7-bitowych znaków ascii), base64 (pasuje do znaków alfanumerycznych), ucieczkę szesnastkową, kompresję gzip i bz2. W Pythonie 2 możesz wykonać:
W Pythonie 3,
str.encode
/bytes.decode
są przeznaczone wyłącznie do konwersji bajtów <-> str. Zamiast tego możesz to zrobić, co działa w Pythonie 2 i Pythonie 3 ( s / encode / decode / g dla odwrotności):Począwszy od Python 3.4, jest mniej niewygodna opcja:
Te różne kodeki są również dostępne we własnych modułach (base64, zlib, bz2, uu, quopri, binascii); interfejs API jest mniej spójny, ale w przypadku kodeków kompresji oferuje większą kontrolę.
źródło
LookupError: unknown encoding: hex
binascii.hexlify(b'foo')
bezpośredniodziała w Pythonie 3.3 (więc „hex_codec” zamiast „hex”).
źródło
Metoda
binascii.hexlify()
zostanie przekonwertowanabytes
nabytes
reprezentujący ciąg szesnastkowy ascii. Oznacza to, że każdy bajt na wejściu zostanie przekonwertowany na dwa znaki ascii. Jeśli chcesz się spełnićstr
, możesz uzyskać.decode("ascii")
wynik.Dołączyłem fragment, który to ilustruje.
z ciągiem szesnastkowym
"0a160a04"
, aby można wrócić dobytes
zbinascii.unhexlify("0a160a04")
której oddajeb'\n\x16\n\x04'
źródło
OK, poniższa odpowiedź jest nieco poza zakresem, jeśli dbasz tylko o Python 3, ale to pytanie jest pierwszym hitem Google, nawet jeśli nie określisz wersji Python, więc oto sposób, który działa zarówno na Python 2, jak i Python 3 .
Interpretuję również pytanie o konwersję bajtów na
str
typ: to znaczy bajty-y w Pythonie 2 i Unicode-y w Pythonie 3.Biorąc to pod uwagę, najlepszym znanym mi podejściem jest:
Poniższe stwierdzenie będzie prawdziwe dla Pythona 2 lub Pythona 3, zakładając, że nie aktywowałeś
unicode_literals
przyszłości w Pythonie 2:(Lub możesz użyć,
''.join()
aby pominąć spację między bajtami itp.)źródło
można użyć specyfikatora formatu,
%x02
który formatuje i generuje wartość szesnastkową. Na przykład:źródło
res.upper()
Nowość w Pythonie 3.8, możesz przekazać argument
hex
funkcji ogranicznika, tak jak w tym przykładziehttps://docs.python.org/3/library/stdtypes.html#bytes.hex
źródło
Jeśli chcesz przekonwertować b '\ x61' na 97 lub „0x61”, możesz spróbować:
Odniesienie: https://docs.python.org/3.5/library/struct.html
źródło