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!
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
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
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ę.
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'
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").
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'
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.)
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
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
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