Skip to content

Convertir hexadecimal a texto (y texto a hex)

Convierte hexadecimal a texto y texto a hex. Pega el hex en cualquier forma — con espacios, 0x, \x, salida de xxd o hexdump, arrays de bytes de Java o C — y se detecta ASCII, UTF-8, GBK o UTF-16. En tu navegador.

Sin rastreo Se ejecuta en el navegador Gratis
La conversión se ejecuta por completo en tu navegador: nada de lo que pegas sale de este dispositivo.
Prueba un ejemplo

Leído como hex sin formato · 13 bytes

    Texto
    Hello, 世界

    UTF-8 detectado automáticamente: todas las secuencias multibyte están bien formadas.

    Los mismos bytes en cada codificación

    Codificación Se lee como
    UTF-8 Se decodifica sin errores Hello, 世界
    GBK / GB18030 Se decodifica sin errores Hello, 涓栫晫
    UTF-16LE Tiene bytes no decodificables 效汬Ɐ隸闧�
    UTF-16BE Tiene bytes no decodificables 䡥汬漬⃤뢖�
    ISO-8859-1 Se decodifica sin errores Hello, ä¸<96>ç<95><8C>
    Los volcados hex, arrays de bytes y mensajes de error citados aquí se capturaron de ejecuciones reales de xxd, Python 3.14, Node.js 26, Go 1.27 y clang, y se prueba que los formatos de salida del motor vuelven a leerse como los bytes originales. El comportamiento de Java y PHP se cita de la documentación oficial. — Equipo de Ingeniería de Go Tools · Sep 16, 2026

    Escrito y revisado por los desarrolladores que crean las utilidades de codificación de Go Tools. Cada valor hex y cada salida que se citan en esta página los genera el propio motor de la página y los verifican pruebas automatizadas.

    Hex a ASCII: respuestas rápidas

    ¿Qué es 48 65 6C 6C 6F en texto?

    Hello En ASCII y UTF-8, 48 es H, 65 es e, 6C es l y 6F es o.

    ¿Cuántos bytes ocupa un carácter chino?

    Normalmente 3 bytes en UTF-8, 2 en GBK 你 es E4 BD A0 en UTF-8 y C4 E3 en GBK.

    ¿Qué es 0D 0A?

    CR LF (\r\n) Retorno de carro seguido de salto de línea: el final de línea que usan Windows, HTTP y la mayoría de los juegos de comandos serie.

    ¿Cuál es la letra A en hex?

    41 La a minúscula es 61; las dos siempre se diferencian en 20.

    ¿Qué es la conversión de hex a texto?

    El hexadecimal es una forma de escribir bytes: cada byte, de 0 a 255, se escribe con dos dígitos, de 00 a FF. Convertir hex a texto consiste en volver a transformar esos bytes en texto legible, y siempre implica elegir una codificación de caracteres: la tabla que dice qué byte, o qué secuencia de bytes, representa cada carácter.

    Con texto en inglés la elección rara vez se nota, porque ASCII, UTF-8, GBK y la mayoría de las demás codificaciones coinciden en los bytes 00 a 7F. Con cualquier otra cosa se nota enseguida. Los bytes C4 E3 BA C3 son 你好 en GBK y no son válidos en UTF-8, mientras que 你好 en UTF-8 es E4 BD A0 E5 A5 BD. El hex es solo la mitad de la información; la codificación es la otra mitad.

    Convertir texto a hex es lo contrario: codificar el texto en bytes y escribir cada byte como dos dígitos hex. Los desarrolladores lo usan para ver exactamente qué pasa por una línea serie o qué entra en una columna de base de datos, para meter datos binarios en el código fuente y para comparar lo que dos sistemas enviaron realmente.

    $ 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

    Qué hace este conversor hexadecimal

    Pega hex en cualquier forma

    Con espacios, compacto, separado por dos puntos o guiones, valores 0x, escapes \x, codificación %, arrays de C, Go y Java, la salida con signo de Arrays.toString de Java, literales bytes de Python, Buffers de Node.js y pantallas completas de xxd, hexdump -C y od. La página te dice qué reconoció y qué eliminó.

    Codificación detectada, con el motivo

    La detección automática busca una marca de orden de bytes, UTF-8 bien formado, UTF-16, ASCII puro y, por último, GBK, y te dice qué regla decidió. GBK solo se elige cuando los bytes se leen como caracteres chinos comunes, así que las tramas binarias cortas se señalan como probablemente no texto en lugar de mostrarse como chino sin sentido.

    Todas las codificaciones lado a lado

    Los mismos bytes se muestran como UTF-8, GBK, UTF-16LE, UTF-16BE e ISO-8859-1, y cada lectura indica si se decodifica limpiamente o no. Cuando el texto sale ilegible, la lectura correcta suele estar una fila más abajo.

    Bytes invisibles a la vista

    NUL, CR, LF, ESC y otros bytes de control se muestran como ␀ ␍ ␊ ␛, de modo que un 00 al final o un 0D que falta en datos de protocolo salta a la vista. Al copiar se siguen obteniendo los caracteres reales.

    Salida lista para pegar en el código

    Texto → Hex genera hex con espacios o compacto, listas 0x, escapes \x, un array de C al estilo de xxd -i, un byte[] de Java con valores con signo, un literal bytes de Python igual al de repr(), un []byte de Go o un volcado xxd — y la página puede volver a leer todos ellos.

    Nada sale de tu navegador

    El análisis y la decodificación se ejecutan localmente en JavaScript. Nada se sube, se almacena ni se pone en la URL, así que puedes pegar sin riesgo capturas de paquetes y logs de producción.

    Hex a texto en código

    Python 3

    bytes.fromhex(h).decode()

    bytes.fromhex('48 65 6c 6c 6f').decode('utf-8') devuelve 'Hello'; se admiten espacios entre bytes, pero no un prefijo 0x. La operación inversa es s.encode('utf-8').hex(), o .hex(' ') para una salida con espacios. Pasa 'gbk' para decodificar o codificar texto chino en GBK.

    JavaScript (Node.js)

    Buffer.from(h, 'hex')

    Buffer.from(h, 'hex').toString('utf8') decodifica y Buffer.from(s, 'utf8').toString('hex') codifica. Una entrada no válida no produce error: la decodificación se detiene en el primer par incorrecto y se descarta un último dígito suelto, así que valida antes.

    JavaScript (navegador)

    TextDecoder / TextEncoder

    Convierte los pares con parseInt(pair, 16) en un Uint8Array y luego llama a new TextDecoder('utf-8').decode(bytes). TextDecoder también lee 'gbk', 'big5' y 'shift_jis', pero TextEncoder solo produce UTF-8.

    Java 17+

    HexFormat.of()

    new String(HexFormat.of().parseHex(h), StandardCharsets.UTF_8) decodifica y HexFormat.of().formatHex(s.getBytes(StandardCharsets.UTF_8)) codifica. En versiones anteriores, formatea cada byte con String.format("%02x", b); evita Integer.toHexString(b), que imprime ffffffe4 para bytes negativos.

    Go

    encoding/hex

    hex.DecodeString(h) devuelve los bytes y string(b) los convierte en cadena; hex.EncodeToString([]byte(s)) hace lo contrario. Es estricto: los espacios devuelven invalid byte: U+0020 ' ' y una longitud impar devuelve odd length hex string.

    C

    sscanf with %2hhx

    Recorre la cadena de dos en dos dígitos hacia un búfer unsigned char y añade un '\0' final. Para imprimir hex, haz un cast a unsigned char y usa %02X; de lo contrario, donde char tiene signo, los bytes por encima de 0x7F pueden imprimirse como FFFFFFE4.

    PHP

    hex2bin() / bin2hex()

    hex2bin('48656c6c6f') devuelve Hello y bin2hex('Hello') devuelve 48656c6c6f. El manual documenta que hex2bin() devuelve false con un E_WARNING ante una entrada de longitud impar o no válida.

    Shell (xxd)

    xxd -r -p / xxd -p

    echo 48656c6c6f | xxd -r -p imprime Hello, y printf 'Hello' | xxd -p imprime 48656c6c6f. Usa printf en lugar de echo al codificar, porque echo añade un salto de línea final, 0a.

    C# (.NET 5+)

    Convert.FromHexString()

    Encoding.UTF8.GetString(Convert.FromHexString(h)) decodifica y Convert.ToHexString(Encoding.UTF8.GetBytes(s)) codifica (en mayúsculas, sin separadores). FromHexString rechaza los espacios y el prefijo 0x. .NET Core y .NET 5+ no incluyen GBK: llama primero a Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) y después a Encoding.GetEncoding(936).

    Ejemplos de hex a texto

    Hex UTF-8 con caracteres chinos

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

    Los siete primeros bytes son ASCII puro: 48 65 6C 6C 6F es Hello, 2C es una coma y 20 un espacio. E4 B8 96 y E7 95 8C son secuencias UTF-8 de tres bytes para 世 y 界 — la mayoría de los caracteres chinos ocupan tres bytes en UTF-8. Como todas las secuencias están bien formadas, la detección automática lo lee como UTF-8.

    Una lectura de sensor en GBK que no es UTF-8 válido

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

    Muchos dispositivos serie envían el texto chino en GBK. Aquí CE C2 es 温 y B6 C8 es 度, 3A 32 35 2E 33 es el ASCII :25.3 y A1 E6 es el signo ℃ de ancho completo — dos bytes por cada carácter chino o símbolo. Leídos como UTF-8, los bytes no son válidos (CE inicia una secuencia de dos bytes, pero C2 no es un byte de continuación), y leídos como GBK son caracteres comunes, así que la detección automática elige GBK. Un conversor que solo conoce UTF-8 muestra aquí caracteres de reemplazo.

    Salida de xxd pegada tal cual

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

    Esto es exactamente lo que imprime printf 'Hi 你好\r\n' | xxd. El offset 00000000: y la columna de caracteres de la derecha se eliminan antes de decodificar; si se leyeran como datos, solo los ocho ceros ya se convertirían en cuatro bytes NUL al principio. Los dos últimos bytes, 0d 0a, son un salto de línea de Windows, que se muestra como ␍␊.

    Un array de bytes de Java sacado de un log

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

    Arrays.toString(bytes) imprime en decimal los bytes con signo de Java. Los valores negativos son bytes de 0x80 en adelante: -28 es 256 − 28 = 228 = 0xE4. Los seis bytes E4 B8 AD E6 96 87 son la codificación UTF-8 de 中文.

    Texto a hex para un comando AT por puerto serie

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

    Los módems y la mayoría de los juegos de comandos UART esperan que cada comando termine en retorno de carro más salto de línea. Un cuadro de texto solo produce 0A al pulsar Intro, así que marca Saltos de línea como CR LF y el final de línea pasa a ser 0D 0A.

    Hex codificado en hex dos veces

    653462646130653561356264
    e4bda0e5a5bd → 你好

    Cada byte aquí es un dígito hexadecimal ASCII (65 es e, 34 es 4, 62 es b), así que la primera decodificación produce otra cadena hex. Ocurre cuando una cadena hex se trata como texto y se vuelve a convertir. La página ofrece la segunda ronda, que da 你好. Para evitar falsas alarmas, solo la ofrece cuando el primer resultado tiene al menos 12 dígitos hex y el segundo se decodifica en texto real — fechas, marcas de tiempo, valores CRC32 y hashes MD5 no la activan.

    Cómo convertir hexadecimal a texto

    1. 1

      Pega el hex

      Pégalo en el recuadro de la pestaña Hex → Texto en la forma que lo tengas: con espacios, compacto, valores 0x, escapes \x, un array de bytes o una pantalla entera de xxd. La línea bajo el recuadro indica cómo se interpretó.

    2. 2

      Revisa el texto y la codificación

      El texto aparece a la derecha, con la codificación detectada automáticamente y el motivo. Si la detección se equivoca, la tabla de abajo muestra todas las lecturas; elige la correcta en el menú Codificación.

    3. 3

      Busca caracteres invisibles

      Los bytes de control como NUL, CR y LF se muestran como ␀ ␍ ␊. Desmarca Mostrar caracteres invisibles para ver el texto sin más y luego copia el resultado.

    4. 4

      O convierte texto a hex

      En la pestaña Texto → Hex, elige la codificación y un formato de salida — hex con espacios, valores 0x, un array de C, Java, Python o Go, o un volcado xxd. Marca CR LF para protocolos serie y de red.

    Por qué falla la conversión de hex a texto

    Decodificar bytes GBK como UTF-8

    El texto chino de software antiguo de Windows, de muchos dispositivos serie y de bases de datos heredadas está en GBK. Decodificarlo como UTF-8 falla o llena la salida de caracteres de reemplazo. Mira la tabla de codificaciones y usa la lectura que tenga sentido.

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

    Usar charCodeAt() para obtener bytes en JavaScript

    charCodeAt() devuelve una unidad de código UTF-16. Con ASCII coincide con el byte, así que el fallo solo aparece con otros caracteres, donde el resultado no es lo que envía ningún sistema UTF-8.

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

    Formatear bytes con signo con Integer.toHexString en Java

    El byte de Java tiene signo, así que los bytes de 0x80 en adelante son negativos. Integer.toHexString() trabaja con un int, imprime los valores negativos como hex sin signo de 32 bits y elimina los ceros a la izquierda.

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

    Fiarse de Buffer.from() de Node.js con hex sin validar

    Buffer.from(hex, 'hex') nunca lanza excepciones. Se detiene en el primer par que no es hex válido e ignora un último dígito suelto, así que una errata te da un buffer más corto en lugar de un error.

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

    Pegar un volcado hexadecimal con su columna de offsets

    Un conversor que solo elimina espacios lee el offset 00000000: como datos y, donde puede, la columna de caracteres como más hex. El resultado empieza con bytes NUL y se desvía a partir de ahí. Usa xxd -p para obtener hex sin más, o pega el volcado aquí, donde se reconocen las columnas.

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

    Enviar LF cuando el dispositivo espera CR LF

    Los módems AT y muchos protocolos basados en líneas terminan cada comando con retorno de carro más salto de línea. Un comando que termina solo en 0A suele ignorarse sin ningún error.

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

    Cuándo necesitas convertir hex a texto

    Depuración serie y UART
    Los terminales serie muestran los datos recibidos en hex. Pega una trama para leer el texto que contiene y detectar el 0D 0A o el 00 del final — y haz el camino inverso para construir un comando, con finales de línea CR LF, que el dispositivo acepte.
    Leer capturas de paquetes
    Las cargas útiles de protocolo copiadas de Wireshark o tcpdump están en hex. Decodificar una línea de petición, un cuerpo JSON o el nombre de un dispositivo dentro de una trama es más rápido aquí que escribir un script, y nada sale de tu máquina.
    Arrays de bytes en logs de aplicaciones
    Java registra los arrays de bytes como decimales con signo, Python como literales b'...' y Node.js como <Buffer ...>. Pega el fragmento del log tal cual para ver el texto, incluido si era UTF-8 o GBK.
    Columnas hex y BLOB en bases de datos
    Las herramientas de bases de datos muestran las columnas binarias en hex. Decodifica un valor para comprobar qué se almacenó realmente, o convierte texto a hex para comparar byte a byte con lo que contiene la base de datos.
    Cadenas en firmware y código C
    El código embebido guarda el texto en arrays de bytes. Convierte una cadena en un array de C listo para pegar, o vuelve a leer como texto un array de un archivo de cabecera para confirmar qué imprimirá el dispositivo.

    Cómo se corresponde el hex con el texto: ASCII, UTF-8, GBK y UTF-16

    Dos dígitos hex por byte
    Un byte tiene 8 bits y un dígito hex representa 4, así que cada byte son exactamente dos dígitos hex, de 00 a FF, y el número de bytes es siempre la mitad del número de dígitos. Mayúsculas y minúsculas significan lo mismo. Los separadores, los prefijos y la sintaxis de array son solo notación: 4865, 48 65, 0x48, 0x65 y \x48\x65 son los mismos dos bytes.
    ASCII: los bytes en los que coinciden todas las codificaciones
    ASCII asigna de 00 a 7F. Los caracteres imprimibles van de 20 (espacio) a 7E (~); el resto son caracteres de control, de los cuales 00 (NUL), 09 (tabulación), 0A (salto de línea), 0D (retorno de carro) y 1B (escape) son los que más aparecen en datos reales. UTF-8, GBK e ISO-8859-1 conservan estos valores, y por eso el texto en inglés sobrevive a casi cualquier codificación equivocada.
    UTF-8: de uno a cuatro bytes por carácter
    UTF-8 escribe el ASCII como bytes sueltos y cualquier otro carácter como una secuencia. El primer byte anuncia la longitud — C2DF para dos bytes, E0EF para tres, F0F4 para cuatro — y cada byte siguiente debe estar en 80BF. Esa estructura estricta explica que una frase en GBK casi nunca sea UTF-8 válido — en nuestra prueba con 33.910 frases chinas, 55 lo eran — y que la detección automática confíe en una decodificación UTF-8 limpia. Con un solo carácter chino es distinto: alrededor del 18% de los caracteres GBK forman por casualidad una secuencia UTF-8 válida de dos bytes.
    GBK: dos bytes por carácter chino
    GBK mantiene el ASCII como bytes sueltos y codifica los caracteres chinos y la puntuación de ancho completo con dos: un byte inicial de 81 a FE seguido de un byte final de 40 a FE, excepto 7F. Como el rango del byte final es tan amplio, un texto UTF-8 corto leído como GBK suele decodificarse sin ningún error en caracteres sin relación — E4 BD A0 E5 A5 BD (你好) se convierte en 浣犲ソ —, y por eso esta página prueba primero UTF-8. GB18030 amplía GBK con secuencias de cuatro bytes para caracteres más raros; la decodificación de esta página las acepta.
    UTF-16 y orden de los bytes
    UTF-16 usa dos bytes por carácter (cuatro para los caracteres fuera del plano multilingüe básico), y los dos bytes pueden ir en cualquier orden. UTF-16LE pone primero el byte menos significativo — A es 41 00 — y UTF-16BE el más significativo — 00 41. Las API de Windows y muchos archivos usan little-endian y pueden empezar con una marca de orden de bytes, FF FE; los archivos UTF-8 a veces empiezan con EF BB BF. La detección automática elimina la marca de orden de bytes y lo indica.

    Convertir entre hex y texto de forma fiable

    Indica la codificación en ambos extremos
    El hex por sí solo no dice qué codificación lo produjo. Dondequiera que el texto se convierta en bytes — getBytes(), encode(), la configuración de un terminal serie, el charset de una conexión a base de datos — fija la codificación de forma explícita y anótala junto al hex, para que el otro lado no tenga que adivinarla.
    Trabaja con bytes, no con códigos de carácter
    Las funciones que devuelven códigos de carácter, como charCodeAt() de JavaScript o los valores char de Java, dan unidades de código UTF-16, no bytes codificados. Codifica primero la cadena con TextEncoder, Buffer.from() o getBytes(StandardCharsets.UTF_8) y después formatea los bytes.
    Rellena siempre cada byte a dos dígitos
    Usa %02x o un equivalente, nunca una simple conversión de número a hex. a y 0a se parecen en un log, pero concatenar valores sin rellenar produce una cadena de longitud impar o, peor aún, una que se decodifica en bytes distintos.
    Mantén los mismos separadores en todo un log
    Elige un formato para logs y trazas, como pares separados por espacios, y cíñete a él. Los formatos mezclados son fáciles de leer para las personas y fáciles de malinterpretar para los scripts, sobre todo cuando unos valores están rellenados y otros no.
    Comprueba el número de bytes
    Antes de fiarte de una conversión, compara el número de bytes con lo que esperas: el campo de longitud de una cabecera de protocolo, el tamaño de la columna o el tamaño del archivo. La página muestra el recuento en ambas direcciones.

    Preguntas frecuentes sobre hexadecimal a texto

    ¿Cómo convertir hexadecimal a texto?
    Pega el hex en el recuadro de la pestaña Hex → Texto; el texto aparece al instante. A mano son dos pasos. Primero, divide el hex en pares: cada par de dígitos hexadecimales es un byte, de 00 a FF, así que 48656c6c6f son los cinco bytes 48, 65, 6C, 6C, 6F. Segundo, decodifica esos bytes con una codificación de caracteres. En ASCII y UTF-8, 48 es H, 65 es e, 6C es l y 6F es o, lo que da Hello. En el segundo paso es donde los resultados difieren: los bytes por encima de 7F significan caracteres distintos en UTF-8, GBK y otras codificaciones, y por eso esta página detecta la codificación y muestra todas las lecturas una al lado de otra.
    ¿Por qué mi hex se convierte en caracteres ilegibles?
    Casi siempre porque los bytes se decodifican con la codificación equivocada. El texto chino es el caso clásico: C4 E3 BA C3 es 你好 en GBK pero UTF-8 no válido, y E4 BD A0 E5 A5 BD es 你好 en UTF-8 pero se convierte en 浣犲ソ al leerlo como GBK. Mira la tabla de codificaciones bajo el resultado: la fila que se lee como texto con sentido es la codificación en la que se escribieron los datos. Con solo uno o dos caracteres, la detección automática no siempre puede distinguirlo: D2 BB es UTF-8 válido (һ) y también GBK (一), así que revisa la línea GBK que la página muestra bajo el resultado. Conviene descartar otras dos causas: un dígito hex de más o de menos, que desplaza medio byte todos los bytes siguientes, y pegar un volcado hexadecimal con la columna de offsets todavía incluida. Si lo que tienes ya es texto ilegible (como 浣犲ソ) y no hex, pega ese texto en el conversor de codificación.
    ¿Por qué los datos serie se ven ilegibles como texto pero correctos en hex?
    Si el hex es correcto, la velocidad en baudios, los bits de datos y la paridad están bien: si fallaran, cambiarían los propios bytes. El problema está en el paso que convierte los bytes en caracteres, y suele ser una de tres cosas. Puede que los datos no sean texto en absoluto: un protocolo binario como Modbus RTU solo tiene sentido en hex. Puede que la codificación no coincida: un dispositivo envía chino en UTF-8 mientras el terminal serie muestra GBK, o al revés, de modo que los bytes UTF-8 E4 BD A0 E5 A5 BD de 你好 aparecen como 浣犲ソ. O el texto contiene bytes de control como 00 o 0D 0A, que se ven como cuadraditos o saltos de línea. Pega el hex aquí: la tabla de codificaciones muestra las lecturas UTF-8 y GBK una junto a otra, y los bytes de control aparecen como ␀ ␍ ␊.
    ¿Qué diferencia hay entre hex a ASCII y hex a UTF-8?
    ASCII solo define los bytes 00 a 7F: letras, dígitos, signos de puntuación y caracteres de control. UTF-8 está diseñado para que esos mismos bytes signifiquen exactamente los mismos caracteres, y usa secuencias de bytes de 80 en adelante para todo lo demás — 2 bytes para letras latinas acentuadas, 3 para la mayoría de los caracteres chinos, japoneses y coreanos, 4 para los emoji. Así que, para texto en inglés sin más, hex a ASCII y hex a UTF-8 dan resultados idénticos. Difieren en cuanto un byte vale 80 o más: un conversor que solo conoce ASCII no puede mostrar esos bytes como caracteres, mientras que UTF-8 los decodifica en todo el rango de Unicode. Para ver qué representa cada byte de 00 a 7F, consulta la tabla ASCII.
    ¿Cuántos bytes ocupa un carácter chino en hex?
    Depende de la codificación. En UTF-8 la mayoría de los caracteres chinos ocupan 3 bytes: 你 es E4 BD A0. En GBK y GB2312 ocupan 2 bytes: 你 es C4 E3. En UTF-16 los caracteres del plano multilingüe básico ocupan 2 bytes, y el orden de los bytes importa: 你 es 60 4F en UTF-16LE y 4F 60 en UTF-16BE. Los caracteres poco frecuentes fuera de ese plano ocupan 4 bytes en UTF-8, 4 en UTF-16 (un par sustituto) y 4 en GB18030. Cambia la codificación en la pestaña Texto → Hex para ver el número de bytes de tu propio texto.
    ¿Cómo convertir hex a texto en Python?
    Usa bytes.fromhex() y luego decodifica: bytes.fromhex('48656c6c6f').decode('utf-8') devuelve 'Hello'. fromhex acepta espacios entre bytes, así que bytes.fromhex('48 65 6c 6c 6f') también funciona, pero rechaza un prefijo 0x con un ValueError. Para datos GBK, decodifica con 'gbk': bytes.fromhex('c4e3bac3').decode('gbk') devuelve '你好', mientras que decodificar los mismos bytes como UTF-8 lanza UnicodeDecodeError. La operación inversa es '你好'.encode('utf-8').hex(), que devuelve 'e4bda0e5a5bd'; pasa un separador, como .hex(' '), para obtener la salida separada por espacios.
    ¿Cómo convertir hex a texto en JavaScript?
    En Node.js, Buffer.from('48656c6c6f', 'hex').toString('utf8') devuelve 'Hello'. Cuidado con las entradas incorrectas: Node no lanza ninguna excepción — se detiene en el primer par no válido y descarta en silencio un último dígito suelto, así que Buffer.from('486', 'hex') es un buffer de un solo byte. En el navegador, construye los bytes tú mismo y usa TextDecoder, que también lee GBK: new TextDecoder('gbk').decode(Uint8Array.from('c4e3bac3'.match(/../g), h => parseInt(h, 16))) devuelve '你好'. No uses charCodeAt() para obtener bytes: '你'.charCodeAt(0).toString(16) es '4f60', una unidad de código UTF-16, no los bytes UTF-8 e4bda0.
    ¿Cómo convertir una cadena hex a texto en C o C++?
    Lee dos dígitos hex cada vez en un búfer unsigned char y después termínalo: for (size_t i = 0; i < n; i++) sscanf(hex + 2 * i, "%2hhx", &buf[i]); buf[n] = '\0'; donde n es strlen(hex) / 2. Con hex igual a 48656c6c6f2c20e4b896e7958c, imprimir buf da Hello, 世界 en un terminal UTF-8. Para la dirección contraria, imprime cada byte con printf("%02X ", (unsigned char)s[i]). El cast es importante: en plataformas donde char tiene signo, un byte como 0xE4 se extendería con signo y se imprimiría como FFFFFFE4. En C++, añade cada par a la cadena con s.push_back(static_cast<char>(std::stoi(hex.substr(i, 2), nullptr, 16))); el mismo hex da Hello, 世界.
    ¿Cómo convertir hex a texto en Java y por qué imprime ffffffe4?
    En Java 17 y posteriores basta una línea: new String(HexFormat.of().parseHex(hex), StandardCharsets.UTF_8); para datos GBK usa Charset.forName("GBK") en su lugar. En sentido contrario, la sorpresa clásica es ffffffe4, porque el byte de Java tiene signo, mientras que Integer.toHexString() recibe un int. El byte 0xE4 se almacena como -28; al ampliarlo a int conserva el valor -28, y toHexString imprime los números negativos como su valor sin signo de 32 bits, ffffffe4. El mismo método también elimina los ceros a la izquierda, así que 0x0A sale como a. Usa String.format("%02x", b), que formatea un byte negativo como su valor sin signo de 8 bits, o Integer.toHexString(b & 0xff) rellenando con ceros. En Java 17 y posteriores, HexFormat.of().formatHex(bytes) convierte un array completo, y HexFormat.of().parseHex(hex) hace lo contrario.
    ¿Qué función de PHP convierte hex a texto?
    hex2bin() decodifica una cadena hex en una cadena binaria y bin2hex() hace lo contrario: bin2hex('Hello') devuelve 48656c6c6f. Según el manual de PHP, hex2bin() devuelve false y emite un E_WARNING cuando la entrada tiene longitud impar o no es hexadecimal válido, así que elimina los espacios y los prefijos 0x antes de llamarla. Las cadenas de PHP son bytes, de modo que el resultado tiene la codificación que usara el texto original — convierte la salida GBK con mb_convert_encoding() si tu página está en UTF-8.
    ¿Puedo pegar directamente la salida de xxd o hexdump?
    Sí. La columna de offsets y la de caracteres se reconocen y se eliminan, y la línea bajo el cuadro de entrada te avisa de ello. Esto importa porque un conversor que solo quita los espacios lee los offsets como datos. La página admite xxd (incluidos -u, -c y -g), hexdump -C, hex.Dump de Go, od -A x -t x1 y od -t x1z de GNU, y expande la línea * que hexdump y od imprimen en lugar de las filas repetidas. También admite hexdump sin opciones y od -x, que imprimen palabras de 16 bits en vez de bytes: en una máquina little-endian los bytes 48 69 se imprimen como 6948, así que la página vuelve a intercambiar cada par y usa el último offset para quitar el byte de relleno añadido a los datos de longitud impar. Cada variante de xxd, hexdump y od se probó con 600 volcados reales de datos aleatorios.
    ¿Qué significa un número impar de dígitos hex?
    Que algo se perdió o se añadió, porque cada byte son exactamente dos dígitos hex. Las causas habituales son un cero inicial eliminado por una función que convierte un número a hex (a en lugar de 0a), un carácter cortado al copiar o una letra que se coló, como O en lugar de 0. Una cadena hex obtenida convirtiendo todos los bytes como un único número grande, como hex(int.from_bytes(data, 'big')) en Python, pierde el cero del principio: \r\n sale como 0xd0a. La página no adivina qué dígito falta, porque adivinar mal desplaza medio byte todos los bytes siguientes y produce un sinsentido convincente. En su lugar, ofrece dos correcciones de un clic — añadir un 0 al principio o quitar el último dígito — para que compares los resultados. Los valores escritos uno a uno con prefijo, como 0x0 0xa, no dan problema: cada uno se lee como un byte completo.
    ¿Se sube a algún sitio lo que pego?
    No. La conversión se ejecuta en JavaScript en tu navegador: nada se envía a un servidor, se almacena ni se añade a la URL de la página. Puedes comprobarlo en el panel Red de las herramientas para desarrolladores de tu navegador. Aquí eso importa, porque el hex que se pega en un conversor suele ser una captura de paquetes, un volcado de firmware o una línea de un log de producción.

    Herramientas relacionadas

    Ver todas las herramientas →