Mam ABC123EFFF.
Chcę mieć 001010101111000001001000111110111111111111 (tj. Binarny odpowiednik z, powiedzmy, 42 cyframi i wiodącymi zerami).
W jaki sposób?
Aby rozwiązać lewostronny problem z końcowym zerem:
my_hexdata = "1a"
scale = 16 ## equals to hexadecimal
num_of_bits = 8
bin(int(my_hexdata, scale))[2:].zfill(num_of_bits)
Da 00011010 zamiast wersji przyciętej.
len(my_hexdata) * log2(scale)
.Czytać
binascii.unhexlify
Zwraca dane binarne reprezentowane przez ciąg szesnastkowy określony jako parametr.
źródło
źródło
Krótka odpowiedź:
Nowe f-stringi w Pythonie 3.6 pozwalają na to przy użyciu bardzo zwięzłej składni:
albo żeby zerwać z semantyką:
Długa odpowiedź:
W rzeczywistości mówisz, że masz wartość w reprezentacji szesnastkowej i chcesz przedstawić równoważną wartość w postaci binarnej.
Wartość równoważności jest liczbą całkowitą. Ale możesz zacząć od ciągu znaków, a aby wyświetlić dane binarne, musisz zakończyć ciągiem.
Konwertować szesnastkowe na binarne, 42 cyfry i wiodące zera?
Mamy kilka bezpośrednich sposobów osiągnięcia tego celu, bez hacków przy użyciu plasterków.
Po pierwsze, zanim w ogóle będziemy mogli wykonać jakąkolwiek operację binarną, przekonwertuj na int (zakładam, że jest to w formacie ciągu, a nie jako literał):
alternatywnie możemy użyć literału całkowitego wyrażonego w postaci szesnastkowej:
Teraz musimy wyrazić naszą liczbę całkowitą w postaci binarnej.
Użyj funkcji wbudowanej,
format
Następnie przejdź do
format
:Używa mini-języka specyfikacji formatowania .
Aby to wyjaśnić, oto forma gramatyczna:
Aby uczynić to specyfikacją dla naszych potrzeb, po prostu wykluczamy rzeczy, których nie potrzebujemy:
i po prostu przekaż to do formatu
Formatowanie ciągów (tworzenie szablonów) za pomocą
str.format
Możemy tego użyć w łańcuchu za pomocą
str.format
metody:Lub po prostu umieść specyfikację bezpośrednio w oryginalnym ciągu:
Formatowanie ciągów za pomocą nowych f-stringów
Pokażmy nowe struny F. Używają tych samych reguł formatowania w minijęzykach:
Teraz umieśćmy tę funkcjonalność w funkcji zachęcającej do ponownego użycia:
I teraz:
Na bok
Jeśli faktycznie chciałeś zakodować dane jako ciąg bajtów w pamięci lub na dysku, możesz użyć
int.to_bytes
metody, która jest dostępna tylko w Pythonie 3:A ponieważ 42 bity podzielone przez 8 bitów na bajt to 6 bajtów:
źródło
„0b1010101111000001001000111110111111111111”
źródło
źródło
Oto dość surowy sposób na zrobienie tego za pomocą bitowego manipulowania przy generowaniu ciągów binarnych.
Kluczową kwestią do zrozumienia jest:
Co wygeneruje 0 lub 1, jeśli ustawiony jest i-ty bit n.
Edytuj: używając „nowego” operatora trójskładnikowego:
Stanie się:
(Który TBH nie jestem pewien, jak to jest czytelne)
źródło
01111001
11111110
.To drobny akcent do rozwiązania Glena Maynarda, który moim zdaniem jest właściwym sposobem. Po prostu dodaje element wypełniający.
Wyciągnąłem to z klasy. Po prostu wyjmij,
self,
jeśli pracujesz w samodzielnym skrypcie.źródło
Użyj wbudowanej funkcji format () i funkcji int () Jest to proste i łatwe do zrozumienia. To trochę uproszczona wersja odpowiedzi Aarona
int ()
format()
Przykład
Zobacz także tę odpowiedź
źródło
Zastąp każdą cyfrę szesnastkową odpowiednimi 4 cyframi binarnymi:
źródło
szesnastkowe -> dziesiętne, a następnie dziesiętne -> dwójkowe
źródło
Inny sposób:
źródło
Dodałem obliczenie liczby bitów do wypełnienia do rozwiązania Onedinkenedi. Oto wynikowa funkcja:
Gdzie 16 to podstawa, z której konwertujesz (szesnastkowo), a 4 to liczba bitów potrzebnych do przedstawienia każdej cyfry lub podstawy logu 2 skali.
źródło
źródło
mam krótką nadzieję, która pomaga :-)
najpierw używam twoich danych wejściowych i wyliczam je, aby uzyskać każdy symbol. następnie konwertuję go na binarny i przycinam od 3 pozycji do końca. Sztuczka, aby uzyskać 0, polega na dodaniu maksymalnej wartości wejścia -> w tym przypadku zawsze 16 :-)
krótką formą jest metoda łączenia. Cieszyć się.
źródło
źródło
Binarna wersja ABC123EFFF to w rzeczywistości 1010101111000001001000111110111111111111
Dla prawie wszystkich aplikacji chcesz, aby wersja binarna miała długość będącą wielokrotnością 4 z początkowym dopełnieniem równym 0.
Aby uzyskać to w Pythonie:
Przykład 1:
Przykład 2:
Zauważ, że działa to również w Micropython :)
źródło
Po prostu użyj kodu modułu (uwaga: jestem autorem modułu)
Możesz tam przekonwertować szesnastkowy na dwójkowy.
Konwertujące słowa kluczowe to:
Możesz więc również sformatować: e. hexadecimal_output = bin_to_hex (a_binary_number)
źródło
HEX_TO_BINARY_CONVERSION_TABLE = {'0': '0000',
źródło
źródło
źródło
źródło