Skip to content

Konwerter hex na tekst (i tekst na hex)

Konwersja hex na tekst i tekstu na hex. Wklej hex w dowolnej postaci — ze spacjami, 0x, \x, wynik xxd lub hexdump, tablice bajtów z Javy i C — a narzędzie samo rozpozna ASCII, UTF-8, GBK lub UTF-16. Działa w przeglądarce.

Bez śledzenia Działa w przeglądarce Bezpłatne
Konwersja odbywa się w całości w przeglądarce — wklejone dane nie opuszczają tego urządzenia.
Wypróbuj przykład

Rozpoznano: zwykły hex · bajtów: 13

    Tekst
    Hello, 世界

    Automatycznie wykryto UTF-8: każda sekwencja wielobajtowa jest poprawnie zbudowana.

    Te same bajty w każdym kodowaniu

    Kodowanie Odczyt
    UTF-8 Dekoduje się czysto Hello, 世界
    GBK / GB18030 Dekoduje się czysto Hello, 涓栫晫
    UTF-16LE Zawiera bajty nie do zdekodowania 效汬Ɐ隸闧�
    UTF-16BE Zawiera bajty nie do zdekodowania 䡥汬漬⃤뢖�
    ISO-8859-1 Dekoduje się czysto Hello, ä¸<96>ç<95><8C>
    Zrzuty hex, tablice bajtów i komunikaty o błędach przytoczone na tej stronie pochodzą z rzeczywistych uruchomień xxd, Pythona 3.14, Node.js 26, Go 1.27 i clang, a formaty wyjściowe silnika są testowane pod kątem tego, czy odczytane z powrotem dają oryginalne bajty. Zachowanie Javy i PHP opisano na podstawie oficjalnej dokumentacji. — Zespół inżynierski Go Tools · Sep 16, 2026

    Tekst napisali i zweryfikowali programiści, którzy tworzą narzędzia do kodowania w Go Tools. Każda wartość hex i każdy wynik przytoczony na tej stronie pochodzi z silnika tej strony i jest sprawdzany przez testy automatyczne.

    Hex na ASCII — szybkie odpowiedzi

    Jaki tekst to 48 65 6C 6C 6F?

    Hello W ASCII i UTF-8 48 to H, 65 to e, 6C to l, a 6F to o.

    Ile bajtów zajmuje jeden chiński znak?

    Zwykle 3 bajty w UTF-8, 2 w GBK 你 to E4 BD A0 w UTF-8 i C4 E3 w GBK.

    Co oznacza 0D 0A?

    CR LF (\r\n) Powrót karetki, po którym następuje wysunięcie wiersza — koniec wiersza używany w Windows, HTTP i większości zestawów komend szeregowych.

    Jak zapisać literę A w hex?

    41 Mała litera a to 61; wielka i mała litera zawsze różnią się o 20.

    Czym jest konwersja hex na tekst?

    Zapis szesnastkowy (hex) to sposób zapisywania bajtów: każdy bajt, od 0 do 255, zapisuje się dwiema cyframi od 00 do FF. Konwersja hex na tekst zamienia te bajty z powrotem w czytelny tekst i zawsze wymaga wyboru kodowania znaków — tabeli, która określa, jaki bajt lub ciąg bajtów oznacza jaki znak.

    Przy tekście angielskim ten wybór rzadko daje o sobie znać, bo ASCII, UTF-8, GBK i większość innych kodowań zgadzają się co do bajtów od 00 do 7F. Przy każdym innym tekście ujawnia się od razu. Bajty C4 E3 BA C3 to 你好 w GBK i niepoprawna sekwencja w UTF-8, a 你好 w UTF-8 to E4 BD A0 E5 A5 BD. Hex to tylko połowa informacji; drugą połową jest kodowanie.

    Konwersja tekstu na hex działa odwrotnie: tekst koduje się do bajtów, a potem każdy bajt zapisuje jako dwie cyfry szesnastkowe. Programiści używają jej, żeby zobaczyć, co dokładnie idzie przez łącze szeregowe albo trafia do kolumny w bazie danych, żeby umieścić dane binarne w kodzie źródłowym i żeby porównać, co naprawdę wysłały dwa systemy.

    $ echo 48656c6c6f | xxd -r -p
    Hello
    
    >>> bytes.fromhex('c4e3bac3').decode('gbk')
    '你好'
    >>> bytes.fromhex('c4e3bac3').decode('utf-8')
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation byte

    Co potrafi ten konwerter hex

    Hex wklejony w dowolnej postaci

    Ze spacjami, bez separatorów, rozdzielony dwukropkami lub myślnikami, wartości 0x, sekwencje \x, kodowanie %, tablice z C, Go i Javy, wynik Arrays.toString z javowymi bajtami ze znakiem, literały bytes z Pythona, Buffery z Node.js oraz pełne ekrany xxd, hexdump -C i od. Strona informuje, co rozpoznała i co usunęła.

    Wykryte kodowanie wraz z uzasadnieniem

    Automatyczne wykrywanie sprawdza znacznik kolejności bajtów, poprawny UTF-8, UTF-16, czyste ASCII, a na końcu GBK, i podaje, która reguła przesądziła. GBK jest wybierane tylko wtedy, gdy bajty dają popularne chińskie znaki, więc krótkie ramki binarne są oznaczane jako prawdopodobnie niebędące tekstem, a nie jako bezsensowne chińskie znaki.

    Wszystkie kodowania obok siebie

    Te same bajty są pokazane jako UTF-8, GBK, UTF-16LE, UTF-16BE i ISO-8859-1, a przy każdym odczycie widać, czy dekoduje się czysto. Gdy tekst wychodzi zniekształcony, poprawny odczyt jest zwykle wiersz niżej.

    Niewidoczne bajty na widoku

    NUL, CR, LF, ESC i inne bajty sterujące są wyświetlane jako ␀ ␍ ␊ ␛, więc końcowe 00 albo brakujące 0D w danych protokołu od razu rzuca się w oczy. Kopiowanie nadal daje prawdziwe znaki.

    Wynik gotowy do wklejenia w kod

    Tekst → hex generuje hex ze spacjami lub bez, listy 0x, sekwencje \x, tablicę C w stylu xxd -i, byte[] Javy z wartościami ze znakiem, literał bytes Pythona zgodny z repr(), []byte z Go albo zrzut xxd — a strona potrafi odczytać z powrotem każdy z tych formatów.

    Nic nie opuszcza przeglądarki

    Rozpoznawanie formatu i dekodowanie odbywają się lokalnie w JavaScripcie. Nic nie jest wysyłane, zapisywane ani umieszczane w adresie URL, więc przechwycony ruch sieciowy i logi produkcyjne można bezpiecznie wklejać.

    Hex na string w kodzie

    Python 3

    bytes.fromhex(h).decode()

    bytes.fromhex('48 65 6c 6c 6f').decode('utf-8') zwraca 'Hello'; spacje między bajtami są dozwolone, prefiks 0x nie. W drugą stronę: s.encode('utf-8').hex() albo .hex(' ') dla wyniku ze spacjami. Podaj 'gbk', aby dekodować lub kodować chiński tekst w GBK.

    JavaScript (Node.js)

    Buffer.from(h, 'hex')

    Buffer.from(h, 'hex').toString('utf8') dekoduje, Buffer.from(s, 'utf8').toString('hex') koduje. Niepoprawne dane nie są błędem: dekodowanie zatrzymuje się na pierwszej złej parze, a końcowa nieparzysta cyfra jest pomijana, więc najpierw trzeba sprawdzić dane.

    JavaScript (przeglądarka)

    TextDecoder / TextEncoder

    Zamień pary przez parseInt(pair, 16) na Uint8Array, a potem wywołaj new TextDecoder('utf-8').decode(bytes). TextDecoder czyta też 'gbk', 'big5' i 'shift_jis', ale TextEncoder generuje wyłącznie UTF-8.

    Java 17+

    HexFormat.of()

    new String(HexFormat.of().parseHex(h), StandardCharsets.UTF_8) dekoduje, a HexFormat.of().formatHex(s.getBytes(StandardCharsets.UTF_8)) koduje. W starszych wersjach formatuj każdy bajt przez String.format("%02x", b); unikaj Integer.toHexString(b), które dla ujemnych bajtów wypisuje ffffffe4.

    Go

    encoding/hex

    hex.DecodeString(h) zwraca bajty, a string(b) zamienia je na string; hex.EncodeToString([]byte(s)) działa w drugą stronę. Pakiet jest restrykcyjny: spacje dają błąd invalid byte: U+0020 ' ', a nieparzysta długość — odd length hex string.

    C

    sscanf with %2hhx

    Przejdź w pętli po ciągu, po dwie cyfry naraz, zapisując bajty do bufora unsigned char, i dodaj kończące '\0'. Aby wypisać hex, rzutuj na unsigned char i użyj %02X; inaczej tam, gdzie char jest typem ze znakiem, bajty powyżej 0x7F mogą zostać wypisane jako FFFFFFE4.

    PHP

    hex2bin() / bin2hex()

    hex2bin('48656c6c6f') zwraca Hello, a bin2hex('Hello') zwraca 48656c6c6f. Dokumentacja podaje, że hex2bin() zwraca false z E_WARNING dla danych o nieparzystej długości lub niepoprawnych.

    Shell (xxd)

    xxd -r -p / xxd -p

    echo 48656c6c6f | xxd -r -p wypisuje Hello, a printf 'Hello' | xxd -p wypisuje 48656c6c6f. Przy kodowaniu używaj printf zamiast echo, bo echo dodaje na końcu znak nowego wiersza, 0a.

    C# (.NET 5+)

    Convert.FromHexString()

    Encoding.UTF8.GetString(Convert.FromHexString(h)) dekoduje, a Convert.ToHexString(Encoding.UTF8.GetBytes(s)) koduje (wielkimi literami, bez separatorów). FromHexString odrzuca spacje i prefiks 0x. .NET Core i .NET 5+ nie mają wbudowanego GBK: najpierw wywołaj Encoding.RegisterProvider(CodePagesEncodingProvider.Instance), a potem Encoding.GetEncoding(936).

    Przykłady konwersji hex na tekst

    Hex UTF-8 z chińskimi znakami

    48 65 6C 6C 6F 2C 20 E4 B8 96 E7 95 8C
    Hello, 世界

    Pierwsze siedem bajtów to zwykłe ASCII: 48 65 6C 6C 6F to Hello, 2C to przecinek, a 20 spacja. E4 B8 96 i E7 95 8C to trzybajtowe sekwencje UTF-8 dla 世 i 界 — większość chińskich znaków zajmuje w UTF-8 trzy bajty. Ponieważ każda sekwencja jest poprawnie zbudowana, automatyczne wykrywanie odczytuje dane jako UTF-8.

    Odczyt z czujnika w GBK, który nie jest poprawnym UTF-8

    CE C2 B6 C8 3A 32 35 2E 33 A1 E6
    温度:25.3℃

    Wiele urządzeń szeregowych wysyła chiński tekst w GBK. Tutaj CE C2 to 温, B6 C8 to 度, 3A 32 35 2E 33 to ASCII :25.3, a A1 E6 to pełnoszerokościowy znak ℃ — po dwa bajty na każdy chiński znak lub symbol. Odczytane jako UTF-8 bajty są niepoprawne (CE rozpoczyna sekwencję dwubajtową, ale C2 nie jest bajtem kontynuacji), a odczytane jako GBK dają popularne znaki, więc automatyczne wykrywanie wybiera GBK. Konwerter, który zna tylko UTF-8, pokaże tu znaki zastępcze.

    Wynik xxd wklejony bez zmian

    00000000: 4869 20e4 bda0 e5a5 bd0d 0a              Hi ........
    Hi 你好␍␊

    Dokładnie to wypisuje printf 'Hi 你好\r\n' | xxd. Offset 00000000: i kolumna znaków po prawej są usuwane przed dekodowaniem; gdyby odczytać je jako dane, już samo osiem zer dałoby na początku cztery bajty NUL. Ostatnie dwa bajty, 0d 0a, to windowsowy koniec wiersza, wyświetlany jako ␍␊.

    Tablica bajtów Javy z logu

    [-28, -72, -83, -26, -106, -121]
    中文

    Arrays.toString(bytes) wypisuje javowe bajty ze znakiem w zapisie dziesiętnym. Wartości ujemne to bajty od 0x80 w górę: -28 to 256 − 28 = 228 = 0xE4. Sześć bajtów E4 B8 AD E6 96 87 to zapis 中文 w UTF-8.

    Tekst na hex dla komendy AT przez port szeregowy

    AT+CSQ\r\n
    41 54 2B 43 53 51 0D 0A

    Modemy i większość zestawów komend UART oczekują, że każda komenda kończy się powrotem karetki i wysunięciem wiersza. Pole tekstowe po naciśnięciu Enter wstawia tylko 0A, więc zaznacz Końce wierszy jako CR LF, a koniec wiersza zmieni się w 0D 0A.

    Hex zakodowany w hex dwukrotnie

    653462646130653561356264
    e4bda0e5a5bd → 你好

    Każdy bajt jest tu cyfrą szesnastkową zapisaną w ASCII (65 to e, 34 to 4, 62 to b), więc pierwsze dekodowanie daje kolejny ciąg hex. Dzieje się tak, gdy ciąg hex zostanie potraktowany jak tekst i przekonwertowany jeszcze raz. Strona proponuje drugą rundę, która daje 你好. Aby unikać fałszywych alarmów, proponuje ją tylko wtedy, gdy pierwszy wynik ma co najmniej 12 cyfr szesnastkowych, a drugi dekoduje się do prawdziwego tekstu — daty, znaczniki czasu, wartości CRC32 i hashe MD5 jej nie wywołują.

    Jak przekonwertować hex na tekst

    1. 1

      Wklej hex

      Wklej go w pole na karcie Hex → tekst w dowolnej postaci: ze spacjami, bez separatorów, jako wartości 0x, sekwencje \x, tablicę bajtów albo cały ekran xxd. Wiersz pod polem pokazuje, jak został odczytany.

    2. 2

      Sprawdź tekst i kodowanie

      Tekst pojawia się po prawej stronie razem z automatycznie wykrytym kodowaniem i powodem wyboru. Jeśli wybór jest błędny, tabela poniżej pokazuje wszystkie odczyty; właściwy wybierz z menu Kodowanie.

    3. 3

      Poszukaj niewidocznych znaków

      Bajty sterujące, takie jak NUL, CR i LF, są wyświetlane jako ␀ ␍ ␊. Odznacz Pokaż niewidoczne znaki, aby zobaczyć sam tekst, a potem skopiuj wynik.

    4. 4

      Albo przekonwertuj tekst na hex

      Na karcie Tekst → hex wybierz kodowanie i format wyniku — hex ze spacjami, wartości 0x, tablicę C, Java, Python lub Go albo zrzut xxd. Dla protokołów szeregowych i sieciowych zaznacz CR LF.

    Dlaczego konwersja hex na tekst się nie udaje

    Dekodowanie bajtów GBK jako UTF-8

    Chiński tekst ze starszego oprogramowania dla Windows, wielu urządzeń szeregowych i starych baz danych jest w GBK. Zdekodowanie go jako UTF-8 albo kończy się błędem, albo wypełnia wynik znakami zastępczymi. Zajrzyj do tabeli kodowań i użyj odczytu, który ma sens.

    ✗ Niepoprawne
    >>> bytes.fromhex('c4e3bac3').decode('utf-8')
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation byte
    ✓ Poprawne
    >>> bytes.fromhex('c4e3bac3').decode('gbk')
    '你好'

    Pobieranie bajtów przez charCodeAt() w JavaScripcie

    charCodeAt() zwraca jednostkę kodową UTF-16. Dla ASCII przypadkiem pokrywa się ona z bajtem, więc błąd ujawnia się dopiero przy innych znakach, gdzie wynik nie odpowiada temu, co wysyła jakikolwiek system UTF-8.

    ✗ Niepoprawne
    '你'.charCodeAt(0).toString(16)   // '4f60' — a UTF-16 code unit
    ✓ Poprawne
    Buffer.from('你', 'utf8').toString('hex')   // 'e4bda0' — the UTF-8 bytes

    Formatowanie bajtów ze znakiem przez Integer.toHexString w Javie

    byte w Javie jest typem ze znakiem, więc bajty od 0x80 w górę są ujemne. Integer.toHexString() działa na typie int, wypisuje wartości ujemne jako 32-bitowy hex bez znaku i pomija wiodące zera.

    ✗ Niepoprawne
    Integer.toHexString(b)        // "ffffffe4" for 0xE4, "a" for 0x0A
    ✓ Poprawne
    String.format("%02x", b)      // "e4", "0a"

    Ślepe zaufanie do Buffer.from() z Node.js przy niesprawdzonym hex

    Buffer.from(hex, 'hex') nigdy nie rzuca wyjątku. Zatrzymuje się na pierwszej parze, która nie jest poprawnym hex, i ignoruje końcową nieparzystą cyfrę, więc literówka daje krótszy bufor zamiast błędu.

    ✗ Niepoprawne
    Buffer.from('486', 'hex')      // <Buffer 48> — the 6 is silently dropped
    Buffer.from('48zz65', 'hex')   // <Buffer 48> — stops at zz
    ✓ Poprawne
    if (!/^([0-9a-f]{2})*$/i.test(hex)) throw new Error('invalid hex');
    Buffer.from(hex, 'hex');

    Wklejanie zrzutu hex z kolumną offsetów

    Konwerter, który usuwa tylko spacje, odczytuje offset 00000000: jako dane, a kolumnę znaków — tam, gdzie się da — jako kolejny hex. Wynik zaczyna się od bajtów NUL, a dalej rozjeżdża się coraz bardziej. Użyj xxd -p, aby dostać czysty hex, albo wklej zrzut tutaj, gdzie kolumny są rozpoznawane.

    ✗ Niepoprawne
    00000000: 4869 20e4 bda0 e5a5 bd0d 0a              Hi ........
    → read naively: 00 00 00 00 48 69 20 e4 …
    ✓ Poprawne
    $ printf 'Hi 你好\r\n' | xxd -p
    486920e4bda0e5a5bd0d0a

    Wysyłanie LF tam, gdzie urządzenie oczekuje CR LF

    Modemy AT i wiele protokołów opartych na wierszach kończy każdą komendę powrotem karetki i wysunięciem wiersza. Komenda zakończona samym 0A jest często ignorowana bez żadnego komunikatu o błędzie.

    ✗ Niepoprawne
    41 54 2B 43 53 51 0A      AT+CSQ followed by LF only
    ✓ Poprawne
    41 54 2B 43 53 51 0D 0A   AT+CSQ followed by CR LF

    Kiedy przydaje się konwerter hex na tekst

    Debugowanie portu szeregowego i UART
    Terminale szeregowe pokazują odebrane dane w hex. Wklej ramkę, aby odczytać zawarty w niej tekst i wychwycić 0D 0A albo 00 na końcu — albo przejdź w drugą stronę i zbuduj komendę z końcami wierszy CR LF, którą urządzenie przyjmie.
    Analiza przechwyconego ruchu sieciowego
    Dane protokołów skopiowane z Wiresharka albo tcpdump są w hex. Odczytanie wiersza żądania, treści JSON albo nazwy urządzenia zaszytej w ramce jest tu szybsze niż pisanie skryptu, a nic nie opuszcza komputera.
    Tablice bajtów w logach aplikacji
    Java loguje tablice bajtów jako liczby dziesiętne ze znakiem, Python jako literały b'...', a Node.js jako <Buffer ...>. Wklej fragment logu bez zmian, aby zobaczyć tekst — i sprawdzić, czy był w UTF-8, czy w GBK.
    Kolumny hex i BLOB-y w bazach danych
    Narzędzia bazodanowe pokazują kolumny binarne w hex. Zdekoduj wartość, aby sprawdzić, co faktycznie zapisano, albo przekonwertuj tekst na hex, aby porównać go bajt po bajcie z zawartością bazy.
    Ciągi znaków w firmware i kodzie C
    Kod dla systemów wbudowanych przechowuje tekst w tablicach bajtów. Zamień ciąg znaków na tablicę C gotową do wklejenia albo odczytaj tablicę z pliku nagłówkowego z powrotem jako tekst, aby potwierdzić, co wyświetli urządzenie.

    Jak bajty hex przekładają się na tekst: ASCII, UTF-8, GBK i UTF-16

    Dwie cyfry szesnastkowe na bajt
    Bajt ma 8 bitów, a jedna cyfra szesnastkowa — 4, więc każdy bajt to dokładnie dwie cyfry, od 00 do FF, a liczba bajtów zawsze wynosi połowę liczby cyfr. Wielkość liter nie ma znaczenia. Separatory, prefiksy i składnia tablic to tylko notacja: 4865, 48 65, 0x48, 0x65 i \x48\x65 to te same dwa bajty.
    ASCII: bajty, co do których zgadzają się wszystkie kodowania
    ASCII obejmuje wartości od 00 do 7F. Znaki drukowalne zajmują zakres od 20 (spacja) do 7E (~); pozostałe to znaki sterujące, spośród których w prawdziwych danych najczęściej pojawiają się 00 (NUL), 09 (tabulator), 0A (wysunięcie wiersza), 0D (powrót karetki) i 1B (escape). UTF-8, GBK i ISO-8859-1 zachowują te wartości, dlatego zwykły angielski tekst przetrwa niemal każde błędne kodowanie.
    UTF-8: od jednego do czterech bajtów na znak
    UTF-8 zapisuje ASCII jako pojedyncze bajty, a każdy inny znak jako sekwencję. Pierwszy bajt określa długość — C2DF dla dwóch bajtów, E0EF dla trzech, F0F4 dla czterech — a każdy kolejny bajt musi mieścić się w zakresie 80BF. Ta ścisła struktura sprawia, że zdanie w GBK niemal nigdy nie jest poprawnym UTF-8 — w naszym teście na 33 910 chińskich zdaniach takich było 55 — i dlatego automatyczne wykrywanie ufa czystemu dekodowaniu UTF-8. Z pojedynczym chińskim znakiem jest inaczej: około 18% znaków GBK przypadkiem tworzy poprawną dwubajtową sekwencję UTF-8.
    GBK: dwa bajty na chiński znak
    GBK zachowuje ASCII jako pojedyncze bajty, a chińskie znaki i interpunkcję pełnej szerokości koduje dwoma bajtami: wiodącym od 81 do FE i końcowym od 40 do FE z wyłączeniem 7F. Ponieważ zakres bajtu końcowego jest tak szeroki, krótki tekst UTF-8 odczytany jako GBK często dekoduje się bez żadnego błędu do niepowiązanych znaków — E4 BD A0 E5 A5 BD (你好) staje się 浣犲ソ — dlatego ta strona najpierw próbuje UTF-8. GB18030 rozszerza GBK o sekwencje czterobajtowe dla rzadszych znaków; dekodowanie na tej stronie je akceptuje.
    UTF-16 i kolejność bajtów
    UTF-16 używa dwóch bajtów na znak (czterech dla znaków spoza podstawowej płaszczyzny wielojęzycznej), a te dwa bajty mogą występować w dowolnej kolejności. UTF-16LE umieszcza najpierw młodszy bajt — A to 41 00 — a UTF-16BE starszy — 00 41. API Windows i wiele plików używa kolejności little-endian i może zaczynać się od znacznika kolejności bajtów FF FE; pliki UTF-8 czasem zaczynają się od EF BB BF. Automatyczne wykrywanie usuwa znacznik kolejności bajtów i to zgłasza.

    Jak niezawodnie konwertować hex na tekst i z powrotem

    Nazywaj kodowanie po obu stronach
    Sam hex nie mówi, jakie kodowanie go wytworzyło. Wszędzie tam, gdzie tekst zamienia się w bajty — getBytes(), encode(), ustawienie terminala szeregowego, charset połączenia z bazą danych — ustaw kodowanie jawnie i zapisz je obok hex, żeby druga strona nie musiała zgadywać.
    Pracuj na bajtach, nie na kodach znaków
    Funkcje zwracające kody znaków, takie jak charCodeAt() w JavaScripcie czy wartości char w Javie, dają jednostki kodowe UTF-16, a nie zakodowane bajty. Najpierw zakoduj ciąg przez TextEncoder, Buffer.from() lub getBytes(StandardCharsets.UTF_8), a dopiero potem formatuj bajty.
    Zawsze dopełniaj każdy bajt do dwóch cyfr
    Używaj %02x lub odpowiednika, nigdy gołej konwersji liczby na hex. a i 0a w logu wyglądają podobnie, ale sklejenie niedopełnionych wartości daje ciąg o nieparzystej długości albo, co gorsza, taki, który dekoduje się do innych bajtów.
    Jeden format separatorów w obrębie logu
    Wybierz jeden format dla logów i śladów, np. pary rozdzielone spacjami, i trzymaj się go. Mieszane formaty ludzie czytają bez trudu, ale skrypty łatwo odczytują je błędnie, zwłaszcza gdy część wartości jest dopełniona zerami, a część nie.
    Sprawdzaj liczbę bajtów
    Zanim zaufasz konwersji, porównaj liczbę bajtów z oczekiwaną: z polem długości w nagłówku protokołu, rozmiarem kolumny albo rozmiarem pliku. Strona pokazuje tę liczbę w obu kierunkach.

    Konwersja hex na tekst — najczęściej zadawane pytania

    Jak przekonwertować hex na tekst?
    Wklej hex w pole na karcie Hex → tekst; tekst pojawi się od razu. Ręcznie wymaga to dwóch kroków. Najpierw podziel hex na pary: każda para cyfr szesnastkowych to jeden bajt, od 00 do FF, więc 48656c6c6f to pięć bajtów 48, 65, 6C, 6C, 6F. Następnie zdekoduj te bajty według kodowania znaków. W ASCII i UTF-8 48 to H, 65 to e, 6C to l, a 6F to o, co daje Hello. Na drugim kroku wyniki się rozjeżdżają: bajty powyżej 7F oznaczają różne znaki w UTF-8, GBK i innych kodowaniach, dlatego ta strona wykrywa kodowanie i pokazuje wszystkie odczyty obok siebie.
    Dlaczego hex zamienia się w krzaki?
    Prawie zawsze dlatego, że bajty zdekodowano w złym kodowaniu. Klasycznym przypadkiem jest tekst chiński: C4 E3 BA C3 to 你好 w GBK, ale niepoprawny UTF-8, a E4 BD A0 E5 A5 BD to 你好 w UTF-8, które odczytane jako GBK zamienia się w 浣犲ソ. Spójrz na tabelę kodowań pod wynikiem — wiersz, który daje sensowny tekst, wskazuje kodowanie, w jakim zapisano dane. Przy jednym czy dwóch znakach automatyczne wykrywanie nie zawsze potrafi rozstrzygnąć: D2 BB to poprawny UTF-8 (һ), a zarazem GBK (一), więc sprawdź wiersz z odczytem GBK, który strona pokazuje pod wynikiem. Warto wykluczyć jeszcze dwie przyczyny: nadmiarową lub brakującą cyfrę szesnastkową, która przesuwa każdy następny bajt o pół bajtu, oraz wklejenie zrzutu hex razem z kolumną offsetów. Jeśli zamiast hex masz już same krzaki (np. 浣犲ソ), wklej ten tekst do konwertera kodowania.
    Dane z portu szeregowego jako tekst to krzaki, a w hex są poprawne — dlaczego?
    Skoro hex jest poprawny, to prędkość transmisji, bity danych i kontrola parzystości są ustawione dobrze — przy błędnych ustawieniach zmieniłyby się same bajty. Problem leży w kroku, który zamienia bajty na znaki, i zwykle chodzi o jedną z trzech rzeczy. Dane mogą w ogóle nie być tekstem: protokół binarny, taki jak Modbus RTU, ma sens tylko jako hex. Kodowanie może się nie zgadzać: urządzenie wysyła chiński tekst w UTF-8, a terminal szeregowy wyświetla GBK, albo odwrotnie, więc bajty UTF-8 E4 BD A0 E5 A5 BD odpowiadające 你好 pojawiają się jako 浣犲ソ. Albo tekst zawiera bajty sterujące, takie jak 00 czy 0D 0A, które wyglądają jak kwadraciki albo przejścia do nowego wiersza. Wklej tutaj hex: tabela kodowań pokazuje odczyt w UTF-8 i w GBK obok siebie, a bajty sterujące są wyświetlane jako ␀ ␍ ␊.
    Czym różni się konwersja hex na ASCII od hex na UTF-8?
    ASCII definiuje tylko bajty od 00 do 7F: litery, cyfry, znaki interpunkcyjne i znaki sterujące. UTF-8 zbudowano tak, żeby te same bajty oznaczały dokładnie te same znaki, a dla wszystkich pozostałych używa sekwencji bajtów od 80 w górę — 2 bajty dla liter łacińskich ze znakami diakrytycznymi, 3 dla większości znaków chińskich, japońskich i koreańskich, 4 dla emoji. Dla zwykłego tekstu angielskiego konwersja hex na ASCII i hex na UTF-8 daje więc identyczny wynik. Różnica pojawia się, gdy tylko któryś bajt ma wartość 80 lub wyższą: konwerter obsługujący wyłącznie ASCII nie pokaże takich bajtów jako znaków, a UTF-8 zdekoduje je do pełnego zakresu Unicode. Co oznacza każdy bajt od 00 do 7F, sprawdzisz w tablicy ASCII.
    Ile bajtów w hex zajmuje chiński znak?
    To zależy od kodowania. W UTF-8 większość chińskich znaków zajmuje 3 bajty: 你 to E4 BD A0. W GBK i GB2312 zajmują 2 bajty: 你 to C4 E3. W UTF-16 znaki z podstawowej płaszczyzny wielojęzycznej zajmują 2 bajty, a kolejność bajtów ma znaczenie: 你 to 60 4F w UTF-16LE i 4F 60 w UTF-16BE. Rzadkie znaki spoza tej płaszczyzny zajmują 4 bajty w UTF-8, 4 w UTF-16 (para surogatów) i 4 w GB18030. Zmień kodowanie na karcie Tekst → hex, aby zobaczyć liczbę bajtów dla własnego tekstu.
    Jak przekonwertować hex na string w Pythonie?
    Użyj bytes.fromhex(), a potem zdekoduj wynik: bytes.fromhex('48656c6c6f').decode('utf-8') zwraca 'Hello'. fromhex akceptuje spacje między bajtami, więc bytes.fromhex('48 65 6c 6c 6f') też zadziała, ale prefiks 0x odrzuca z błędem ValueError. Dane w GBK dekoduj z 'gbk': bytes.fromhex('c4e3bac3').decode('gbk') zwraca '你好', a dekodowanie tych samych bajtów jako UTF-8 rzuca UnicodeDecodeError. W drugą stronę działa '你好'.encode('utf-8').hex(), które zwraca 'e4bda0e5a5bd'; podaj separator, np. .hex(' '), aby dostać wynik rozdzielony spacjami.
    Jak przekonwertować hex na string w JavaScripcie?
    W Node.js Buffer.from('48656c6c6f', 'hex').toString('utf8') zwraca 'Hello'. Uwaga na błędne dane: Node nie rzuca wyjątku — zatrzymuje się na pierwszej niepoprawnej parze i po cichu pomija końcową nieparzystą cyfrę, więc Buffer.from('486', 'hex') to bufor jednobajtowy. W przeglądarce trzeba samodzielnie zbudować bajty i użyć TextDecoder, który czyta też GBK: new TextDecoder('gbk').decode(Uint8Array.from('c4e3bac3'.match(/../g), h => parseInt(h, 16))) zwraca '你好'. Nie używaj charCodeAt() do pobierania bajtów: '你'.charCodeAt(0).toString(16) to '4f60', czyli jednostka kodowa UTF-16, a nie bajty UTF-8 e4bda0.
    Jak przekonwertować ciąg hex na string w C lub C++?
    Wczytuj po dwie cyfry szesnastkowe do bufora unsigned char, a na końcu dodaj terminator: for (size_t i = 0; i < n; i++) sscanf(hex + 2 * i, "%2hhx", &buf[i]); buf[n] = '\0';, gdzie n to strlen(hex) / 2. Gdy hex ma wartość 48656c6c6f2c20e4b896e7958c, wypisanie buf w terminalu UTF-8 daje Hello, 世界. W drugą stronę wypisz każdy bajt przez printf("%02X ", (unsigned char)s[i]). Rzutowanie ma znaczenie: na platformach, gdzie char jest typem ze znakiem, bajt taki jak 0xE4 zostałby inaczej rozszerzony ze znakiem i wypisany jako FFFFFFE4. W C++ dopisuj każdą parę przez s.push_back(static_cast<char>(std::stoi(hex.substr(i, 2), nullptr, 16))); ten sam hex daje Hello, 世界.
    Jak przekonwertować hex na string w Javie i dlaczego Java wypisuje ffffffe4?
    W Javie 17 i nowszych wystarczy jedna linijka: new String(HexFormat.of().parseHex(hex), StandardCharsets.UTF_8); dla danych w GBK użyj zamiast tego Charset.forName("GBK"). W drugą stronę klasyczną niespodzianką jest ffffffe4. Bierze się to stąd, że byte w Javie jest typem ze znakiem, a Integer.toHexString() przyjmuje int. Bajt 0xE4 jest przechowywany jako -28; poszerzenie go do int zachowuje wartość -28, a toHexString wypisuje liczby ujemne jako 32-bitową wartość bez znaku, ffffffe4. Ta sama metoda pomija też wiodące zera, więc 0x0A wychodzi jako a. Użyj String.format("%02x", b), które formatuje ujemny bajt jako jego 8-bitową wartość bez znaku, albo Integer.toHexString(b & 0xff) z dopełnieniem zerami. W Javie 17 i nowszych HexFormat.of().formatHex(bytes) konwertuje całą tablicę, a HexFormat.of().parseHex(hex) działa w drugą stronę.
    Która funkcja PHP konwertuje hex na string?
    hex2bin() dekoduje ciąg hex do ciągu binarnego, a bin2hex() działa w drugą stronę: bin2hex('Hello') zwraca 48656c6c6f. Według dokumentacji PHP hex2bin() zwraca false i zgłasza E_WARNING, gdy dane wejściowe mają nieparzystą długość lub nie są poprawnym zapisem szesnastkowym, więc przed wywołaniem usuń spacje i prefiksy 0x. Ciągi w PHP to bajty, więc wynik ma takie kodowanie, jakiego użył oryginalny tekst — jeśli strona jest w UTF-8, przekonwertuj wynik w GBK przez mb_convert_encoding().
    Czy można wkleić wynik xxd lub hexdump bez obróbki?
    Tak. Kolumna offsetów i kolumna znaków są rozpoznawane i usuwane, a wiersz pod polem wejściowym informuje, że tak się stało. Ma to znaczenie, bo konwerter, który usuwa tylko spacje, odczytuje offsety jako dane. Strona obsługuje xxd (także z -u, -c i -g), hexdump -C, hex.Dump z Go, od -A x -t x1 i GNU od -t x1z, a także rozwija wiersz *, który hexdump i od wypisują w miejsce powtarzających się wierszy. Radzi sobie również ze zwykłym hexdump i od -x, które wypisują 16-bitowe słowa zamiast bajtów: na maszynie little-endian bajty 48 69 są wypisywane jako 6948, więc strona zamienia każdą parę z powrotem i na podstawie ostatniego offsetu usuwa bajt dopełnienia dodany do danych o nieparzystej długości. Każdy wariant xxd, hexdump i od przetestowano na 600 prawdziwych zrzutach losowych danych.
    Co oznacza nieparzysta liczba cyfr szesnastkowych?
    Że coś zginęło albo coś się dopisało, bo każdy bajt to dokładnie dwie cyfry szesnastkowe. Typowe przyczyny to wiodące zero pominięte przez funkcję zamieniającą liczbę na hex (a zamiast 0a), znak ucięty przy kopiowaniu albo przypadkowa litera, np. O zamiast 0. Ciąg hex powstały przez konwersję wszystkich bajtów jako jednej dużej liczby, jak w Pythonie hex(int.from_bytes(data, 'big')), traci zero z początku: \r\n wychodzi jako 0xd0a. Strona nie zgaduje, której cyfry brakuje, bo błędny strzał przesuwa każdy kolejny bajt o pół bajtu i daje przekonująco wyglądające bzdury. Zamiast tego proponuje dwie poprawki jednym kliknięciem — dodanie 0 na początku albo usunięcie ostatniej cyfry — dzięki czemu można porównać wyniki. Wartości zapisane osobno z prefiksem, takie jak 0x0 0xa, są w porządku: każda jest odczytywana jako cały bajt.
    Czy wklejone dane są gdzieś wysyłane?
    Nie. Konwersja działa w JavaScripcie w przeglądarce: nic nie jest wysyłane na serwer, zapisywane ani dopisywane do adresu URL strony. Można to sprawdzić w panelu Sieć w narzędziach deweloperskich przeglądarki. Ma to tu znaczenie, bo hex wklejany do konwertera to często przechwycony ruch sieciowy, zrzut firmware'u albo wiersz z logu produkcyjnego.

    Powiązane narzędzia

    Zobacz wszystkie narzędzia →