Mam długi ciąg Hex, który reprezentuje serię wartości różnych typów. Chciałbym przekonwertować ten ciąg szesnastkowy na tablicę bajtów, aby móc przesunąć każdą wartość i przekonwertować ją na odpowiedni typ danych.
Jeśli ktoś szuka szesnastkowego string-> bytesobiektu, to `bytes.fromhex (" 000102030405060708090A0B0C0D0E0F ")` daje wynik b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'. Nie wysyłanie jako odpowiedź, ponieważ pytanie pyta o tablicę bajtów, ale publikowanie tutaj, ponieważ jest to pierwsze trafienie, które otrzymałem podczas wyszukiwania hext do bajtów.
matrixanomaly
@Hubro Właściwie hex_string.decode("hex")pracuje nad Pythonem 2.7. Właśnie przetestowałem na moim Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on win32.
MewX
@MewX Powiedziałem Python 3, a nie Python 2.7
Hubro
3
Zwróć uwagę, że bytes.fromhexzgłasza błąd, gdy ciąg wejściowy ma nieparzystą liczbę znaków: bytes.fromhex("aab")→ ValueError: non-hexadecimal number found in fromhex() arg at position 3.
Константин Ван
143
W bytearray jest wbudowana funkcja, która robi to, co zamierzasz.
bytearray.fromhex("de ad be ef 00")
Zwraca bajtearray i odczytuje ciągi szesnastkowe z separatorem spacji lub bez niego.
Zgadzam się, że unhexlifyjest to najskuteczniejszy sposób, aby przejść tutaj, ale sugerowałbym, że b = bytearray(s)byłoby to lepsze niż używanie ord. Ponieważ Python ma wbudowany typ tylko dla tablic bajtów, jestem zaskoczony, że nikt go nie używa
Scott Griffiths
8
Zakładając, że masz taki ciąg bajtów
„\ x12 \ x45 \ x00 \ xAB”
a znasz ilość bajtów i ich typ, możesz również zastosować to podejście
Spowoduje to iterację po każdym znaku w ciągu i przeprowadzi go przez funkcję ord (). Testowane tylko na Pythonie 2.6, nie jestem pewien co do wersji 3.0+.
Kliknij zarys znacznika wyboru obok tej odpowiedzi, jeśli jest to właściwa odpowiedź! :)
jathanism
1
To nie konwertuje liczby szesnastkowej - konwertuje każdy znak ciągu na liczbę całkowitą. Dla hex każda para znaków reprezentowałaby bajt. Równie dobrze możesz po prostu powiedziećbyte_list = bytearray(hex_string)
Odpowiedzi:
Załóżmy, że twój ciąg szesnastkowy jest podobny
Zamień go na ciąg (Python ≤ 2,7):
lub od wersji Python 2.7 i Python 3.0:
Zauważ, że
bytes
jest to niezmienna wersjabytearray
.źródło
string
->bytes
obiektu, to `bytes.fromhex (" 000102030405060708090A0B0C0D0E0F ")` daje wynikb'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'
. Nie wysyłanie jako odpowiedź, ponieważ pytanie pyta o tablicę bajtów, ale publikowanie tutaj, ponieważ jest to pierwsze trafienie, które otrzymałem podczas wyszukiwania hext do bajtów.hex_string.decode("hex")
pracuje nad Pythonem 2.7. Właśnie przetestowałem na moimPython 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on win32
.bytes.fromhex
zgłasza błąd, gdy ciąg wejściowy ma nieparzystą liczbę znaków:bytes.fromhex("aab")
→ValueError: non-hexadecimal number found in fromhex() arg at position 3
.W bytearray jest wbudowana funkcja, która robi to, co zamierzasz.
Zwraca bajtearray i odczytuje ciągi szesnastkowe z separatorem spacji lub bez niego.
źródło
hex_string.decode("hex")
ale nie.pod warunkiem, że dobrze zrozumiałem, powinieneś poszukać binascii.unhexlify
źródło
unhexlify
jest to najskuteczniejszy sposób, aby przejść tutaj, ale sugerowałbym, żeb = bytearray(s)
byłoby to lepsze niż używanieord
. Ponieważ Python ma wbudowany typ tylko dla tablic bajtów, jestem zaskoczony, że nikt go nie używaZakładając, że masz taki ciąg bajtów
„\ x12 \ x45 \ x00 \ xAB”
a znasz ilość bajtów i ich typ, możesz również zastosować to podejście
Ponieważ określiłem little endian (używając znaku „<”) na początku ciągu formatu, funkcja zwróciła odpowiednik dziesiętny.
0x12 = 18
0x45 = 69
0xAB00 = 43776
B jest równe jednemu bajtowi (8 bitów) bez znaku
H jest równe dwóm bajtom (16 bitów) bez znaku
Więcej dostępnych znaków i rozmiarów bajtów można znaleźć tutaj
Zalety to ...
Możesz określić więcej niż jeden bajt i endian wartości
Niedogodności..
Naprawdę musisz znać rodzaj i długość danych, z którymi masz do czynienia
źródło
Powinieneś być w stanie zbudować ciąg przechowujący dane binarne przy użyciu czegoś takiego:
Prawdopodobnie nie jest to najszybszy sposób (dołącza wiele ciągów znaków), ale dość prosty przy użyciu tylko podstawowego języka Python.
źródło
Możesz użyć modułu Codecs w Python Standard Library, tj
źródło
źródło
Dobra jedna wkładka to:
Spowoduje to iterację po każdym znaku w ciągu i przeprowadzi go przez funkcję ord (). Testowane tylko na Pythonie 2.6, nie jestem pewien co do wersji 3.0+.
-Josh
źródło
byte_list = bytearray(hex_string)