Skip to content

Conversor de Hexadecimal para Texto (e Texto para Hex)

Converta hexadecimal para texto e texto para hex. Cole hex em qualquer formato — com espaços, 0x, \x, saída do xxd ou hexdump, arrays de bytes Java ou C — e ASCII, UTF-8, GBK ou UTF-16 é detectado sozinho. Roda no navegador.

Sem rastreamento Roda no navegador Grátis
A conversão roda inteiramente no seu navegador — nada do que você cola sai deste dispositivo.
Experimente um exemplo

Lido como hex simples · 13 bytes

    Texto
    Hello, 世界

    UTF-8 detectado automaticamente: todas as sequências multibyte são bem formadas.

    Os mesmos bytes em cada codificação

    Codificação Leitura
    UTF-8 Decodifica sem erros Hello, 世界
    GBK / GB18030 Decodifica sem erros Hello, 涓栫晫
    UTF-16LE Tem bytes não decodificáveis 效汬Ɐ隸闧�
    UTF-16BE Tem bytes não decodificáveis 䡥汬漬⃤뢖�
    ISO-8859-1 Decodifica sem erros Hello, ä¸<96>ç<95><8C>
    Os hex dumps, arrays de bytes e mensagens de erro citados aqui foram capturados de execuções reais de xxd, Python 3.14, Node.js 26, Go 1.27 e clang, e os formatos de saída do motor são testados para garantir que sejam lidos de volta nos bytes originais. O comportamento de Java e PHP é citado da documentação oficial. — Equipe de Engenharia Go Tools · Sep 16, 2026

    Escrito e revisado por desenvolvedores que constroem as ferramentas de codificação do Go Tools. Cada valor hex e cada saída citados nesta página são produzidos pelo próprio motor da página e verificados por testes automatizados.

    Hex para ASCII: respostas rápidas

    O que é 48 65 6C 6C 6F em texto?

    Hello Em ASCII e UTF-8, 48 é H, 65 é e, 6C é l e 6F é o.

    Quantos bytes tem um caractere chinês?

    Normalmente 3 bytes em UTF-8, 2 em GBK 你 é E4 BD A0 em UTF-8 e C4 E3 em GBK.

    O que é 0D 0A?

    CR LF (\r\n) Retorno de carro seguido de avanço de linha — a quebra de linha usada pelo Windows, pelo HTTP e pela maioria dos conjuntos de comandos seriais.

    Qual é o valor hex da letra A?

    41 O a minúsculo é 61; maiúscula e minúscula sempre diferem em 20.

    O que é a conversão de hex para string?

    Hexadecimal é uma forma de escrever bytes: cada byte, de 0 a 255, é escrito como dois dígitos, de 00 a FF. A conversão de hex para string transforma esses bytes de volta em texto legível e sempre envolve a escolha de uma codificação de caracteres — a tabela que diz qual byte, ou sequência de bytes, representa qual caractere.

    Em texto em inglês a escolha quase nunca aparece, porque ASCII, UTF-8, GBK e a maioria das outras codificações concordam nos bytes 00 a 7F. Com qualquer outra coisa, ela aparece na hora. Os bytes C4 E3 BA C3 são 你好 em GBK e inválidos em UTF-8, enquanto 你好 em UTF-8 é E4 BD A0 E5 A5 BD. O hex é só metade da informação; a codificação é a outra metade.

    String para hex é o inverso: codifique o texto em bytes e escreva cada byte como dois dígitos hex. Desenvolvedores fazem isso para ver exatamente o que passa por uma linha serial ou entra numa coluna do banco de dados, para colocar dados binários no código-fonte e para comparar o que dois sistemas realmente enviaram.

    $ 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

    O que este conversor hexadecimal faz

    Cole hex em qualquer formato

    Com espaços, compacto, separado por dois-pontos ou hífens, valores 0x, escapes \x, codificação %, arrays C, Go e Java, a saída com sinal de Arrays.toString do Java, literais bytes do Python, Buffers do Node.js e telas completas de xxd, hexdump -C e od. A página diz o que reconheceu e o que removeu.

    Codificação detectada, com o motivo

    A detecção automática procura uma marca de ordem de bytes, UTF-8 bem formado, UTF-16, ASCII puro e, por fim, GBK, e diz qual regra decidiu. GBK só é escolhido quando os bytes formam caracteres chineses comuns, então quadros binários curtos são apontados como provavelmente não sendo texto, em vez de virarem chinês sem sentido.

    Todas as codificações lado a lado

    Os mesmos bytes aparecem como UTF-8, GBK, UTF-16LE, UTF-16BE e ISO-8859-1, cada um marcado conforme decodifica sem erros ou não. Quando o texto sai embaralhado, a leitura correta costuma estar uma linha abaixo.

    Bytes invisíveis à vista

    NUL, CR, LF, ESC e outros bytes de controle aparecem como ␀ ␍ ␊ ␛, então um 00 sobrando no final ou um 0D faltando em dados de protocolo salta aos olhos. Copiar continua trazendo os caracteres reais.

    Saída pronta para colar no código

    Texto → Hex gera hex com espaços ou compacto, listas 0x, escapes \x, um array C no estilo xxd -i, um byte[] Java com valores com sinal, um literal bytes do Python igual ao de repr(), um []byte Go ou um dump xxd — e a página consegue ler cada um deles de volta.

    Nada sai do seu navegador

    A análise e a decodificação rodam localmente em JavaScript. Nada é enviado, armazenado ou colocado na URL, então dá para colar capturas de pacotes e logs de produção com segurança.

    Hex para string no código

    Python 3

    bytes.fromhex(h).decode()

    bytes.fromhex('48 65 6c 6c 6f').decode('utf-8') retorna 'Hello'; espaços entre os bytes são permitidos, um prefixo 0x não. O inverso é s.encode('utf-8').hex(), ou .hex(' ') para saída com espaços. Passe 'gbk' para decodificar ou codificar texto chinês em GBK.

    JavaScript (Node.js)

    Buffer.from(h, 'hex')

    Buffer.from(h, 'hex').toString('utf8') decodifica, Buffer.from(s, 'utf8').toString('hex') codifica. Entrada inválida não gera erro: a decodificação para no primeiro par inválido e um dígito ímpar no final é descartado, então valide antes.

    JavaScript (navegador)

    TextDecoder / TextEncoder

    Converta os pares com parseInt(pair, 16) para um Uint8Array e depois chame new TextDecoder('utf-8').decode(bytes). TextDecoder também lê 'gbk', 'big5' e 'shift_jis', mas TextEncoder só produz UTF-8.

    Java 17+

    HexFormat.of()

    new String(HexFormat.of().parseHex(h), StandardCharsets.UTF_8) decodifica e HexFormat.of().formatHex(s.getBytes(StandardCharsets.UTF_8)) codifica. Em versões mais antigas, formate cada byte com String.format("%02x", b); evite Integer.toHexString(b), que imprime ffffffe4 para bytes negativos.

    Go

    encoding/hex

    hex.DecodeString(h) retorna os bytes e string(b) os transforma em string; hex.EncodeToString([]byte(s)) faz o caminho de volta. É rigoroso: espaços retornam invalid byte: U+0020 ' ' e comprimento ímpar retorna odd length hex string.

    C

    sscanf with %2hhx

    Percorra a string dois dígitos por vez, gravando num buffer de unsigned char, e adicione um '\0' no final. Para imprimir hex, faça cast para unsigned char e use %02X; caso contrário, bytes acima de 0x7F podem sair como FFFFFFE4 onde char tem sinal.

    PHP

    hex2bin() / bin2hex()

    hex2bin('48656c6c6f') retorna Hello e bin2hex('Hello') retorna 48656c6c6f. O manual documenta que hex2bin() retorna false com um E_WARNING para entrada de comprimento ímpar ou inválida.

    Shell (xxd)

    xxd -r -p / xxd -p

    echo 48656c6c6f | xxd -r -p imprime Hello, e printf 'Hello' | xxd -p imprime 48656c6c6f. Use printf em vez de echo ao codificar, porque echo acrescenta uma quebra de linha no final, 0a.

    C# (.NET 5+)

    Convert.FromHexString()

    Encoding.UTF8.GetString(Convert.FromHexString(h)) decodifica e Convert.ToHexString(Encoding.UTF8.GetBytes(s)) codifica (em maiúsculas, sem separadores). FromHexString rejeita espaços e o prefixo 0x. O .NET Core e o .NET 5+ não trazem GBK: chame primeiro Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) e depois Encoding.GetEncoding(936).

    Exemplos de hex para texto

    Hex UTF-8 com caracteres chineses

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

    Os sete primeiros bytes são ASCII puro: 48 65 6C 6C 6F é Hello, 2C é uma vírgula e 20, um espaço. E4 B8 96 e E7 95 8C são sequências UTF-8 de três bytes para 世 e 界 — a maioria dos caracteres chineses ocupa três bytes em UTF-8. Como todas as sequências são bem formadas, a detecção automática lê o hex como UTF-8.

    Leitura de sensor em GBK que não é UTF-8 válido

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

    Muitos dispositivos seriais enviam texto chinês em GBK. Aqui CE C2 é 温 e B6 C8 é 度, 3A 32 35 2E 33 é o ASCII :25.3 e A1 E6 é o sinal ℃ de largura total — dois bytes por caractere chinês ou símbolo. Lidos como UTF-8, os bytes são inválidos (CE inicia uma sequência de dois bytes, mas C2 não é um byte de continuação); lidos como GBK, são caracteres comuns, então a detecção automática escolhe GBK. Um conversor que só conhece UTF-8 mostra caracteres de substituição aqui.

    Saída do xxd colada como está

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

    É exatamente o que printf 'Hi 你好\r\n' | xxd imprime. O offset 00000000: e a coluna de caracteres à direita são removidos antes da decodificação; se fossem lidos como dados, só os oito zeros já virariam quatro bytes NUL no início. Os dois últimos bytes, 0d 0a, são uma quebra de linha do Windows, mostrada como ␍␊.

    Array de bytes Java tirado de um log

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

    Arrays.toString(bytes) imprime em decimal os bytes com sinal do Java. Valores negativos são bytes de 0x80 para cima: -28 é 256 − 28 = 228 = 0xE4. Os seis bytes E4 B8 AD E6 96 87 são a codificação UTF-8 de 中文.

    Texto para hex em um comando AT serial

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

    Modems e a maioria dos conjuntos de comandos UART esperam que todo comando termine em retorno de carro mais avanço de linha. Uma caixa de texto só gera 0A para o Enter, então marque Quebras de linha como CR LF e o fim de linha vira 0D 0A.

    Hex codificado em hex duas vezes

    653462646130653561356264
    e4bda0e5a5bd → 你好

    Todos os bytes aqui são dígitos hex em ASCII (65 é e, 34 é 4, 62 é b), então a primeira decodificação produz outra string hex. Isso acontece quando uma string hex é tratada como texto e convertida de novo. A página oferece a segunda rodada, que dá 你好. Para evitar alarmes falsos, ela só faz essa oferta quando o primeiro resultado tem pelo menos 12 dígitos hex e o segundo decodifica em texto de verdade — datas, timestamps, valores CRC32 e hashes MD5 não a disparam.

    Como converter hexadecimal para texto

    1. 1

      Cole o hex

      Cole na caixa da aba Hex → Texto no formato que você tiver: com espaços, compacto, valores 0x, escapes \x, um array de bytes ou uma tela inteira do xxd. A linha abaixo da caixa diz como ele foi lido.

    2. 2

      Confira o texto e a codificação

      O texto aparece à direita, com a codificação detectada automaticamente e o motivo. Se o palpite estiver errado, a tabela abaixo mostra todas as leituras; escolha a certa no menu Codificação.

    3. 3

      Procure caracteres invisíveis

      Bytes de controle como NUL, CR e LF aparecem como ␀ ␍ ␊. Desmarque Mostrar caracteres invisíveis para ver o texto puro e depois copie o resultado.

    4. 4

      Ou converta texto para hex

      Na aba Texto → Hex, escolha a codificação e um formato de saída — hex com espaços, valores 0x, um array C, Java, Python ou Go, ou um dump xxd. Marque CR LF para protocolos seriais e de rede.

    Por que a conversão de hex para texto dá errado

    Decodificar bytes GBK como UTF-8

    Texto chinês vindo de softwares antigos do Windows, de muitos dispositivos seriais e de bancos de dados legados está em GBK. Decodificá-lo como UTF-8 ou falha ou enche a saída de caracteres de substituição. Olhe a tabela de codificações e use a leitura que faz sentido.

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

    Usar charCodeAt() para obter bytes em JavaScript

    charCodeAt() retorna uma unidade de código UTF-16. Para ASCII ela coincide com o byte, então o bug só aparece com outros caracteres, e aí o resultado não é o que nenhum sistema UTF-8 envia.

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

    Formatar bytes com sinal com Integer.toHexString no Java

    O byte do Java tem sinal, então os bytes de 0x80 para cima são negativos. Integer.toHexString() trabalha com int, imprime valores negativos como hex sem sinal de 32 bits e descarta zeros à esquerda.

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

    Confiar no Buffer.from() do Node.js com hex não validado

    Buffer.from(hex, 'hex') nunca lança erro. Ele para no primeiro par que não é hex válido e ignora um dígito ímpar no final, então um erro de digitação gera um buffer mais curto em vez de um erro.

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

    Colar um hex dump com a coluna de offsets

    Um conversor que só remove espaços lê o offset 00000000: como dados e, onde der, a coluna de caracteres como mais hex. O resultado começa com bytes NUL e desanda a partir daí. Use xxd -p para obter hex puro ou cole o dump aqui, onde as colunas são reconhecidas.

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

    Enviar LF quando o dispositivo espera CR LF

    Modems AT e muitos protocolos baseados em linhas terminam cada comando com retorno de carro mais avanço de linha. Um comando que termina só em 0A muitas vezes é ignorado sem erro nenhum.

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

    Quando você precisa converter hex para texto

    Depuração serial e UART
    Terminais seriais mostram os dados recebidos em hex. Cole um quadro para ler o texto que ele carrega e identificar o 0D 0A ou o 00 no final — e faça o caminho inverso para montar um comando, com fim de linha CR LF, que o dispositivo aceite.
    Leitura de capturas de pacotes
    Payloads de protocolo copiados do Wireshark ou do tcpdump são hex. Decodificar uma linha de requisição, um corpo JSON ou o nome de um dispositivo dentro de um quadro é mais rápido aqui do que escrever um script, e nada sai da sua máquina.
    Arrays de bytes em logs de aplicação
    O Java registra arrays de bytes como decimais com sinal, o Python como literais b'...' e o Node.js como <Buffer ...>. Cole o trecho do log como está para ver o texto, inclusive se era UTF-8 ou GBK.
    Colunas hex e BLOBs em bancos de dados
    Ferramentas de banco de dados mostram colunas binárias como hex. Decodifique um valor para conferir o que foi realmente armazenado, ou converta texto para hex para comparar byte a byte com o que o banco guarda.
    Strings em firmware e código C
    Código embarcado guarda texto em arrays de bytes. Transforme uma string em um array C pronto para colar, ou leia como texto um array de um arquivo de cabeçalho para confirmar o que o dispositivo vai imprimir.

    Como o hex vira texto: ASCII, UTF-8, GBK e UTF-16

    Dois dígitos hex por byte
    Um byte tem 8 bits e um dígito hex tem 4, então todo byte tem exatamente dois dígitos hex, de 00 a FF, e o número de bytes é sempre metade do número de dígitos. Maiúsculas e minúsculas significam a mesma coisa. Separadores, prefixos e sintaxe de array são só notação: 4865, 48 65, 0x48, 0x65 e \x48\x65 são os mesmos dois bytes.
    ASCII: os bytes em que toda codificação concorda
    O ASCII atribui os valores 00 a 7F. Os caracteres imprimíveis vão de 20 (espaço) a 7E (~); o resto são caracteres de controle, dos quais 00 (NUL), 09 (tabulação), 0A (avanço de linha), 0D (retorno de carro) e 1B (escape) são os que mais aparecem em dados reais. UTF-8, GBK e ISO-8859-1 mantêm todos esses valores, e é por isso que texto simples em inglês sobrevive a quase qualquer codificação errada.
    UTF-8: de um a quatro bytes por caractere
    O UTF-8 escreve o ASCII como bytes únicos e todos os outros caracteres como sequências. O primeiro byte anuncia o comprimento — C2DF para dois bytes, E0EF para três, F0F4 para quatro — e cada byte seguinte precisa estar em 80BF. Essa estrutura rígida explica por que uma frase em GBK quase nunca é UTF-8 válido — no nosso teste com 33.910 frases em chinês, 55 eram — e por que a detecção automática confia numa decodificação UTF-8 limpa. Um único caractere chinês é outra história: cerca de 18% dos caracteres GBK formam, por acaso, uma sequência UTF-8 válida de dois bytes.
    GBK: dois bytes por caractere chinês
    O GBK mantém o ASCII como bytes únicos e codifica caracteres chineses e pontuação de largura total com dois: um byte inicial de 81 a FE seguido de um byte final de 40 a FE, excluindo 7F. Como a faixa do byte final é muito ampla, um texto UTF-8 curto lido como GBK muitas vezes decodifica sem erro nenhum em caracteres sem relação — E4 BD A0 E5 A5 BD (你好) vira 浣犲ソ —, e é por isso que esta página tenta UTF-8 primeiro. O GB18030 estende o GBK com sequências de quatro bytes para caracteres mais raros; a decodificação aqui as aceita.
    UTF-16 e ordem dos bytes
    O UTF-16 usa dois bytes por caractere (quatro para caracteres fora do Plano Multilíngue Básico), e esses dois bytes podem vir em qualquer ordem. O UTF-16LE põe o byte menos significativo primeiro — A é 41 00 — e o UTF-16BE, o mais significativo — 00 41. APIs do Windows e muitos arquivos usam little-endian e podem começar com uma marca de ordem de bytes, FF FE; arquivos UTF-8 às vezes começam com EF BB BF. A detecção automática remove a marca de ordem de bytes e avisa.

    Converter entre hex e string sem erros

    Declare a codificação nas duas pontas
    O hex sozinho não diz qual codificação o produziu. Em todo ponto onde texto vira bytes — getBytes(), encode(), a configuração de um terminal serial, o charset de uma conexão com o banco de dados —, defina a codificação explicitamente e anote-a junto do hex, para que o outro lado não precise adivinhar.
    Trabalhe com bytes, não com códigos de caractere
    Funções que retornam códigos de caractere, como o charCodeAt() do JavaScript ou os valores char do Java, dão unidades de código UTF-16 em vez de bytes codificados. Codifique a string primeiro com TextEncoder, Buffer.from() ou getBytes(StandardCharsets.UTF_8) e só então formate os bytes.
    Sempre complete cada byte com dois dígitos
    Use %02x ou equivalente, nunca uma conversão de número para hex sem preenchimento. a e 0a parecem iguais num log, mas concatenar valores sem preenchimento produz uma string de comprimento ímpar ou, pior, uma que decodifica em bytes diferentes.
    Mantenha os separadores consistentes num mesmo log
    Escolha um formato para logs e traces, como pares separados por espaço, e não mude. Formatos misturados são fáceis de ler para pessoas e fáceis de interpretar errado para scripts, principalmente quando alguns valores têm preenchimento e outros não.
    Confira a contagem de bytes
    Antes de confiar numa conversão, compare o número de bytes com o que você espera: o campo de comprimento no cabeçalho de um protocolo, o tamanho da coluna ou o tamanho do arquivo. A página mostra a contagem nas duas direções.

    Perguntas frequentes sobre hex para texto

    Como converter hexadecimal para texto?
    Cole o hex na caixa da aba Hex → Texto; o texto aparece na hora. À mão, são dois passos. Primeiro, divida o hex em pares: cada par de dígitos hex é um byte, de 00 a FF, então 48656c6c6f são os cinco bytes 48, 65, 6C, 6C, 6F. Segundo, decodifique esses bytes com uma codificação de caracteres. Em ASCII e UTF-8, 48 é H, 65 é e, 6C é l e 6F é o, o que dá Hello. É no segundo passo que os resultados divergem: bytes acima de 7F representam caracteres diferentes em UTF-8, GBK e outras codificações, e é por isso que esta página detecta a codificação e mostra todas as leituras lado a lado.
    Por que meu hex vira caracteres estranhos?
    Quase sempre porque os bytes foram decodificados com a codificação errada. Texto chinês é o caso clássico: C4 E3 BA C3 é 你好 em GBK, mas UTF-8 inválido, e E4 BD A0 E5 A5 BD é 你好 em UTF-8, mas vira 浣犲ソ quando lido como GBK. Olhe a tabela de codificações abaixo do resultado — a linha que forma um texto com sentido é a codificação em que os dados foram escritos. Com só um ou dois caracteres, a detecção automática nem sempre consegue distinguir: D2 BB é UTF-8 válido (һ) e também GBK (一), então confira a linha GBK que a página mostra abaixo do resultado. Vale descartar outras duas causas: um dígito hex a mais ou a menos, que desloca todos os bytes seguintes em meio byte, e colar um hex dump com a coluna de offsets ainda junto. Se o que você tem já é texto com caracteres estranhos (como 浣犲ソ), e não hex, cole esse texto no conversor de codificação.
    Por que dados seriais viram caracteres estranhos como texto, mas estão certos em hex?
    Se o hex está certo, o baud rate, os bits de dados e a paridade estão corretos — se estivessem errados, os próprios bytes mudariam. O problema está na etapa que transforma bytes em caracteres, e costuma ser uma de três coisas. Os dados podem nem ser texto: um protocolo binário como o Modbus RTU só faz sentido em hex. A codificação pode não bater: um dispositivo envia chinês em UTF-8 enquanto o terminal serial exibe GBK, ou o contrário, e aí os bytes UTF-8 E4 BD A0 E5 A5 BD de 你好 aparecem como 浣犲ソ. Ou o texto contém bytes de controle como 00 ou 0D 0A, que aparecem como quadradinhos ou quebras de linha. Cole o hex aqui: a tabela de codificações mostra as leituras UTF-8 e GBK lado a lado, e os bytes de controle aparecem como ␀ ␍ ␊.
    Qual a diferença entre hex para ASCII e hex para UTF-8?
    O ASCII só define os bytes 00 a 7F: letras, dígitos, pontuação e caracteres de controle. O UTF-8 foi construído para que esses mesmos bytes signifiquem exatamente os mesmos caracteres e usa sequências de bytes de 80 para cima para todo o resto — 2 bytes para letras latinas acentuadas, 3 para a maioria dos caracteres chineses, japoneses e coreanos, 4 para emoji. Por isso, para texto simples em inglês, hex para ASCII e hex para UTF-8 dão resultados idênticos. Eles divergem assim que um byte vale 80 ou mais: um conversor só de ASCII não consegue mostrar esses bytes como caracteres, enquanto o UTF-8 os decodifica em toda a faixa do Unicode. Para saber o que cada byte de 00 a 7F representa, consulte a tabela ASCII.
    Quantos bytes tem um caractere chinês em hex?
    Depende da codificação. Em UTF-8, a maioria dos caracteres chineses ocupa 3 bytes: 你 é E4 BD A0. Em GBK e GB2312, ocupam 2 bytes: 你 é C4 E3. Em UTF-16, os caracteres do Plano Multilíngue Básico ocupam 2 bytes, e a ordem dos bytes importa: 你 é 60 4F em UTF-16LE e 4F 60 em UTF-16BE. Caracteres raros fora desse plano ocupam 4 bytes em UTF-8, 4 em UTF-16 (um par substituto) e 4 em GB18030. Troque a codificação na aba Texto → Hex para ver a contagem de bytes do seu próprio texto.
    Como converter hex para string em Python?
    Use bytes.fromhex() e depois decodifique: bytes.fromhex('48656c6c6f').decode('utf-8') retorna 'Hello'. fromhex aceita espaços entre os bytes, então bytes.fromhex('48 65 6c 6c 6f') também funciona, mas rejeita um prefixo 0x com ValueError. Para dados em GBK, decodifique com 'gbk': bytes.fromhex('c4e3bac3').decode('gbk') retorna '你好', enquanto decodificar os mesmos bytes como UTF-8 lança UnicodeDecodeError. O inverso é '你好'.encode('utf-8').hex(), que retorna 'e4bda0e5a5bd'; passe um separador como em .hex(' ') para obter a saída separada por espaços.
    Como converter hex para string em JavaScript?
    No Node.js, Buffer.from('48656c6c6f', 'hex').toString('utf8') retorna 'Hello'. Cuidado com entrada inválida: o Node não lança erro — ele para no primeiro par inválido e descarta em silêncio um dígito ímpar no final, então Buffer.from('486', 'hex') é um buffer de um byte. No navegador, monte os bytes você mesmo e use TextDecoder, que também lê GBK: new TextDecoder('gbk').decode(Uint8Array.from('c4e3bac3'.match(/../g), h => parseInt(h, 16))) retorna '你好'. Não use charCodeAt() para obter bytes: '你'.charCodeAt(0).toString(16) é '4f60', uma unidade de código UTF-16, e não os bytes UTF-8 e4bda0.
    Como converter uma string hex para texto em C ou C++?
    Leia dois dígitos hex por vez para um buffer de unsigned char e depois termine a string: for (size_t i = 0; i < n; i++) sscanf(hex + 2 * i, "%2hhx", &buf[i]); buf[n] = '\0';, onde n é strlen(hex) / 2. Com hex valendo 48656c6c6f2c20e4b896e7958c, imprimir buf dá Hello, 世界 em um terminal UTF-8. Para a direção oposta, imprima cada byte com printf("%02X ", (unsigned char)s[i]). O cast importa: em plataformas onde char tem sinal, um byte como 0xE4 seria estendido com sinal e impresso como FFFFFFE4. Em C++, acrescente cada par à string com s.push_back(static_cast<char>(std::stoi(hex.substr(i, 2), nullptr, 16))); o mesmo hex dá Hello, 世界.
    Como converter hex para texto em Java e por que o Java imprime ffffffe4?
    No Java 17 e posteriores é uma linha só: new String(HexFormat.of().parseHex(hex), StandardCharsets.UTF_8); para dados em GBK, use Charset.forName("GBK") no lugar. No sentido contrário, a surpresa clássica é o ffffffe4, porque o byte do Java tem sinal e Integer.toHexString() recebe um int. O byte 0xE4 é armazenado como -28; ao ser promovido a int, mantém o valor -28, e toHexString imprime números negativos como o valor sem sinal de 32 bits, ffffffe4. O mesmo método também descarta zeros à esquerda, então 0x0A sai como a. Use String.format("%02x", b), que formata um byte negativo como seu valor sem sinal de 8 bits, ou Integer.toHexString(b & 0xff) com preenchimento. No Java 17 e posteriores, HexFormat.of().formatHex(bytes) converte um array inteiro, e HexFormat.of().parseHex(hex) faz o caminho de volta.
    Qual função do PHP converte hex para string?
    hex2bin() decodifica uma string hex em uma string binária, e bin2hex() faz o contrário: bin2hex('Hello') retorna 48656c6c6f. Segundo o manual do PHP, hex2bin() retorna false e emite um E_WARNING quando a entrada tem comprimento ímpar ou não é hexadecimal válido, então remova espaços e prefixos 0x antes de chamá-la. Strings do PHP são bytes, então o resultado fica na codificação que o texto original usava — converta a saída GBK com mb_convert_encoding() se a sua página for UTF-8.
    Posso colar a saída do xxd ou do hexdump diretamente?
    Sim. A coluna de offsets e a coluna de caracteres são reconhecidas e removidas, e a linha abaixo da caixa de entrada avisa que isso aconteceu. Isso importa porque um conversor que só remove espaços lê os offsets como dados. A página lida com xxd (incluindo -u, -c e -g), hexdump -C, o hex.Dump do Go, od -A x -t x1 e o od -t x1z do GNU, e expande a linha * que hexdump e od imprimem no lugar de linhas repetidas. Também lida com o hexdump simples e com od -x, que imprimem palavras de 16 bits em vez de bytes: numa máquina little-endian, os bytes 48 69 aparecem como 6948, então a página destroca cada par e usa o último offset para descartar o byte de preenchimento acrescentado a dados de comprimento ímpar. Cada variante de xxd, hexdump e od foi testada com 600 dumps reais de dados aleatórios.
    O que significa um número ímpar de dígitos hex?
    Que algo se perdeu ou sobrou, porque todo byte tem exatamente dois dígitos hex. Causas comuns são um zero à esquerda descartado por uma função de número para hex (a em vez de 0a), um caractere cortado ao copiar ou uma letra intrusa, como O no lugar de 0. Uma string hex gerada ao converter todos os bytes como um único número grande, como hex(int.from_bytes(data, 'big')) do Python, perde o zero do início: \r\n sai como 0xd0a. A página não tenta adivinhar qual dígito está faltando, porque um palpite errado desloca todos os bytes seguintes em meio byte e produz um absurdo convincente. Em vez disso, oferece duas correções de um clique — adicionar um 0 no início ou remover o último dígito — para você comparar os resultados. Valores escritos individualmente com prefixo, como 0x0 0xa, não têm problema: cada um é lido como um byte inteiro.
    Os dados que eu colo são enviados para algum lugar?
    Não. A conversão roda em JavaScript no seu navegador: nada é enviado a um servidor, armazenado ou adicionado à URL da página. Você pode confirmar isso no painel Rede das ferramentas de desenvolvedor do navegador. Isso importa aqui, porque o hex colado num conversor muitas vezes é uma captura de pacotes, um dump de firmware ou uma linha de um log de produção.

    Ferramentas relacionadas

    Ver todas as ferramentas →