§

Options

Tryb
Grupowanie hex
Prefiks 0x
Wielkość liter
Kodowanie tekstu
§

Wejście

§

Wyjście

Inżynierowie PKO BP analizujący komunikaty ISO 8583 w infrastrukturze kartowej sięgają po konwersję hex ↔ ASCII przy każdej inspekcji surowego strumienia bajtów transakcji płatniczej — pole MTI i bitmap doskonale czytają się w hex, natomiast pole danych dodatkowych często ukrywa tekst ASCII wewnątrz binarnej ramki. Technicy PGNiG pracujący przy systemach SCADA z magistralą Modbus RTU używają tego samego podejścia do interpretacji rejestrów holding, gdzie adresy urządzeń i kody funkcji są widoczne jako pary hex, a łańcuchy statusu kryją się w sąsiednich bajtach ASCII.

Jak działa kodowanie hex

Każdy znak na stronie jest przechowywany jako jeden lub więcej bajtów. Kodowanie hex przepisuje te bajty w systemie szesnastkowym — dwa znaki na bajt — dzięki czemu strumień bajtów jest czytelny bez specjalnych narzędzi.

  1. Zakoduj tekst na bajty. Tryb UTF-8 przetwarza wejście przez new TextEncoder().encode(text), zwracając Uint8Array wartości bajtów. Tryb Latin-1 pobiera osiem niższych bitów każdej jednostki kodu przez charCodeAt(0) & 0xFF, co odpowiada konwersji wykonywanej przez starsze kodeki ISO-8859-1.
  2. Renderuj każdy bajt jako dwie cyfry hex. Każdy bajt jest mapowany na dwie cyfry hex przez byte.toString(16).padStart(2, "0"). Przełącznik wielkości liter wybiera wielkie (A-F) lub małe (a-f) litery na wyjściu.
  3. Zastosuj grupowanie i prefiks. Grupowanie wstawia separator między bajty: pojedynczą spację, myślnik lub spację co cztery bajty. Prefiks 0x można dodać raz do całego ciągu (grupowanie Brak) lub przed każdym bajtem (grupowanie Spacja), zgodnie z konwencjami tablic w C i narzędzi do diffowania binarnego.
  4. Dekoduj w odwrotnej kolejności. Tryb Hex → Tekst usuwa wszystkie spacje, myślniki i prefiksy 0x z wejścia, waliduje pozostałe znaki wyrażeniem /^[0-9a-fA-F]+$/, odrzuca ciągi o nieparzystej długości i odtwarza Uint8Array z kolejnych par bajtów. Tryb UTF-8 dekoduje tę tablicę przez new TextDecoder("utf-8", { fatal: true }); tryb Latin-1 mapuje każdy bajt przez String.fromCharCode(b).
  5. Tryb na żywo dla szybkiej iteracji. Tryb na żywo jest domyślnie włączony. Każde naciśnięcie klawisza planuje ponowną konwersję z debounce 150 ms, dzięki czemu możesz wklejać, edytować i obserwować aktualizację drugiego panelu bez klikania przycisku Konwertuj.

Dlaczego używać konwertera hex

  • Debugowanie protokołów binarnych. Formaty przewodowe takie jak Modbus, DNP3 i CoAP pakują nagłówki w określone przesunięcia bajtów. Odczytanie przechwyconych ramek jako hex pokazuje każde pole od razu, a konwersja tych samych bajtów na ASCII ujawnia wszelki tekst jawny ukryty obok binarnego opakowania.
  • Praca z firmware urządzeń wbudowanych. Sondy JTAG i SWD raportują zawartość pamięci w hex. Tłumaczenie obszaru pamięci na ASCII pozwala wykryć osadzone ciągi znaków (ścieżki plików, komunikaty błędów, sygnatury producenta), które często wskazują, w którym miejscu firmware się znajdujesz.
  • Odczytywanie przechwyconych pakietów. Wireshark i tcpdump wyświetlają panel bajtów z hex po lewej i ASCII po prawej. Konwersja fragmentu tutaj pozwala skopiować blob hex z raportu o błędzie lub czatu i przeczytać, co naprawdę mówią bajty, bez ponownego importowania do narzędzia do przechwytywania.
  • Porównywanie plików binarnych bajt po bajcie. Porównywanie dwóch plików binarnych często sprowadza się do wskazania, które bajty się zmieniły. Konwersja obu stron na hex ze spójnym grupowaniem sprawia, że diff wyrównuje się w edytorze tekstu, gdzie wbudowane narzędzie diff może podświetlić zmienione bajty.

Typowe zastosowania

Konwersja hex ↔ ASCII pojawia się w inżynierii odwrotnej, bezpieczeństwie i pracy z systemami wbudowanymi wszędzie tam, gdzie strumień bajtów to więcej niż tylko payload tekstowy.

  • Inżynieria odwrotna: weź zrzut hex z binarki odpornej na strings, wyodrębnij fragmenty dekodujące się jako drukowalne ASCII i użyj tych ciągów jako kotwic w dezasemblacji.
  • Forensyka sieciowa: skopiuj payload pojedynczego pakietu z Wireshark jako hex, wklej tutaj i odczytaj tekst warstwy aplikacyjnej bez eksportowania całego przechwytywania.
  • Obsługa materiału kryptograficznego: klucz, IV lub tag HMAC często dostarczane są jako ciąg hex. Dekodowanie z powrotem na bajty potwierdza, że długość odpowiada algorytmowi (16 bajtów dla AES-128, 32 dla AES-256) przed podłączeniem do konfiguracji.

Przykład krok po kroku

Wybierz Tekst → Hex, UTF-8, małe litery, grupowanie Spacja co bajt, prefiks wyłączony. Wpisz Hi: wyjście to 48 69. Włącz prefiks i zmień grupowanie na Brak — to samo wejście renderuje się jako 0x4869. Wklej emoji 😀 jako wejście, a tryb UTF-8 renderuje f0 9f 98 80 — cztery bajty na jeden punkt kodowy, dlatego emoji często zwiększają rozmiar transmisji. Przełącz na Hex → Tekst i wklej 0x48-65-6C 6C 6F: parser usuwa prefiks, myślniki i spacje, a następnie odtwarza Hello.

FAQ

Co to jest kodowanie hex?

Kodowanie hex (szesnastkowe) zapisuje strumień bajtów w systemie szesnastkowym — dwa znaki ASCII na bajt. Każda cyfra hex obejmuje cztery bity, więc dwie cyfry obejmują jeden ośmiobitowy bajt. Alfabet to 0-9, a następnie A-F (lub a-f); wielkość liter jest czysto prezentacyjna, a dekodery akceptują obie formy. Hex to standardowy sposób zapisu surowych bajtów w specyfikacjach protokołów, wyjściu debuggera i kluczach kryptograficznych, ponieważ jest dwukrotnie bardziej zwarty niż binarny i unika problemów z niedrukowalnymi znakami surowych bajtów w tekście.

Dlaczego moje emoji stają się 4 bajtami w hex?

UTF-8 to kodowanie o zmiennej długości. Znaki ASCII (U+0000 do U+007F) zajmują jeden bajt, dopełnienia Latin-1 dwa, większość innych punktów kodowych BMP trzy, a znaki powyżej U+FFFF — w tym większość emoji — cztery. Uśmiechnięta twarz 😀 to U+1F600 i koduje się do F0 9F 98 80. Jeśli potrzebujesz widoku z bajtami o stałej szerokości, przełącz na Latin-1 — ale Latin-1 obejmuje tylko pierwsze 256 punktów kodowych, więc żaden znak spoza tego zakresu nie może być poprawnie przetworzony.

Czy obsługiwane jest Latin-1 / ISO-8859-1?

Tak. Przełącz opcję Kodowanie tekstu na Latin-1 (ISO-8859-1). Kodowanie pobiera osiem niższych bitów każdej jednostki kodu JavaScript (charCodeAt(0) & 0xFF), co odpowiada starszemu mapowaniu jednobajtowemu. Dekodowanie używa String.fromCharCode(byte) dla każdego bajtu. Używaj Latin-1, gdy pracujesz z danymi ze starszych systemów Windows-1252 lub sprzed Unikodu, gdzie każdy bajt reprezentuje dokładnie jeden znak.

Czy konwersja odbywa się w mojej przeglądarce?

Tak. Konwerter uruchamia TextEncoder, TextDecoder i mały parser jako pojedynczą statyczną stronę. Nie ma uploadu, wywołania API ani analityki tego, co wklejasz — tylko standardowe metryki ładowania strony współdzielone w całej witrynie. Te same bajty hex, które widzisz tutaj, wyprodukowałby skrypt Node lub funkcja Lambda dla tych samych danych wejściowych.

Konwersja hex ↔ ASCII to mała czynność, którą każdy kto czyta protokoły binarne lub firmware urządzeń wbudowanych wykonuje kilka razy dziennie. Robienie tego w karcie przeglądarki, z tymi samymi natywnymi koderami, których Node i V8 już używają, sprawia że praca jest szybka, a strumień bajtów pozostaje na Twoim komputerze.