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.
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.
Rozpoznano: zwykły hex · bajtów: 13
Hello, 世界
Automatycznie wykryto UTF-8: każda sekwencja wielobajtowa jest poprawnie zbudowana.
Wynik sam jest ciągiem hex — prawdopodobnie przekonwertowano go dwa razy. Kolejna runda daje:
| 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> |
48 65 6C 6C 6F 2C 20 E4 B8 96 E7 95 8C
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.
Hello W ASCII i UTF-8 48 to H, 65 to e, 6C to l, a 6F to o.
Zwykle 3 bajty w UTF-8, 2 w GBK 你 to E4 BD A0 w UTF-8 i C4 E3 w GBK.
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.
41 Mała litera a to 61; wielka i mała litera zawsze różnią się o 20.
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 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.
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.
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.
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.
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.
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ć.
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.
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.
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.
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.
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.
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.
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.
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.
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).
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.
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.
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 ␍␊.
[-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.
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.
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ą.
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.
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.
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.
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.
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.
>>> bytes.fromhex('c4e3bac3').decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation byte >>> bytes.fromhex('c4e3bac3').decode('gbk')
'你好' 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.
'你'.charCodeAt(0).toString(16) // '4f60' — a UTF-16 code unit
Buffer.from('你', 'utf8').toString('hex') // 'e4bda0' — the UTF-8 bytes 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.
Integer.toHexString(b) // "ffffffe4" for 0xE4, "a" for 0x0A
String.format("%02x", b) // "e4", "0a" 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.
Buffer.from('486', 'hex') // <Buffer 48> — the 6 is silently dropped
Buffer.from('48zz65', 'hex') // <Buffer 48> — stops at zz if (!/^([0-9a-f]{2})*$/i.test(hex)) throw new Error('invalid hex');
Buffer.from(hex, 'hex'); 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.
00000000: 4869 20e4 bda0 e5a5 bd0d 0a Hi ........ → read naively: 00 00 00 00 48 69 20 e4 …
$ printf 'Hi 你好\r\n' | xxd -p 486920e4bda0e5a5bd0d0a
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.
41 54 2B 43 53 51 0A AT+CSQ followed by LF only
41 54 2B 43 53 51 0D 0A AT+CSQ followed by CR LF
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.b'...', a Node.js jako <Buffer ...>. Wklej fragment logu bez zmian, aby zobaczyć tekst — i sprawdzić, czy był w UTF-8, czy w GBK.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.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.C2–DF dla dwóch bajtów, E0–EF dla trzech, F0–F4 dla czterech — a każdy kolejny bajt musi mieścić się w zakresie 80–BF. 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.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.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.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ć.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.%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.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. 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. 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 ␀ ␍ ␊. 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. 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. 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. 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. 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, 世界. 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ę. 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(). 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. 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. Kodowanie i formatowanie
Pełna tablica ASCII: 128 znaków w systemie dziesiętnym, szesnastkowym, ósemkowym i dwójkowym oraz dwukierunkowy konwerter. Znaki sterujące z sekwencjami escape, notacją z daszkiem i miejscem, gdzie naprawdę się je spotyka.
Kodowanie i formatowanie
Zakoduj i zdekoduj Base64 online za darmo. Konwersja w czasie rzeczywistym z pełną obsługą UTF-8 i emoji. 100% w przeglądarce, bez rejestracji.
Kodowanie i formatowanie
Zdekoduj ciąg Base64 lub data URI z powrotem na obraz w przeglądarce. Podejrzyj, odczytaj wymiary i MIME, a potem pobierz jako PNG, JPG, GIF, SVG. Bez przesyłania.
Kodowanie i formatowanie
Konwertuj CSV na JSON w przeglądarce. RFC 4180, wnioskowanie typów, nagłówek, big-int safe. 100% prywatnie, bez wysyłki.
Kodowanie i formatowanie
Wklej krzaki i odzyskaj oryginalny tekst. Narzędzie sprawdza wszystkie łańcuchy kodowań — UTF-8, GBK, Big5, Shift_JIS, EUC-KR, Windows-1252 — porządkuje wyniki i pokazuje dokładny łańcuch. Za darmo, lokalnie w przeglądarce.
Kodowanie i formatowanie
Wklej plik .env i od razu otrzymaj JSON. Hasła, klucze API i tokeny nigdy nie opuszczają przeglądarki — 100% prywatnie, bez wysyłania, parser dotenv.