edubun
Español

Bytes, hexadecimal y texto

La letra A se guarda como 65, o 01000001. En UTF-8, una sílaba coreana como U+D55C ocupa tres bytes.

Primero, un problema cotidiano. (Es un ejemplo inventado.) Un estudiante escribe la palabra Korean en un chat, seis letras. Una amiga escribe la misma palabra en escritura coreana, que ocupa tres sílabas. ¿Qué mensaje es más grande? Probablemente no el que imaginas. Guardadas en UTF-8, las seis letras inglesas son 6 bytes. Las tres sílabas coreanas son 9 bytes, tres cada una. RFC 3629, el estándar que define UTF-8, usa justo esta palabra como uno de sus ejemplos y detalla sus bytes: ED 95 9C EA B5 AD EC 96 B4. Dos cosas explican la diferencia. Hace falta una forma corta de escribir bytes, y hace falta el acuerdo que convierte letras en números.

Dos dígitos hexadecimales por cada byte

Esos pares de letras y dígitos están en hexadecimal (hex). Las filas largas de ceros y unos cuestan de leer, así que los programadores usan esta forma abreviada. El hexadecimal tiene dieciséis dígitos: del 0 al 9, y luego de la A a la F para diez a quince. Un dígito hexadecimal cubre exactamente cuatro bits, así que un byte siempre son dos dígitos hexadecimales. Divide 01000001 en 0100 y 0001. Son 4 y 1, así que el byte es 0x41, donde 0x solo indica «esto es hexadecimal». En decimal es 4 × 16 + 1 = 65.

Seguramente ya te has topado con el hexadecimal sin darte cuenta. Los colores de las páginas web suelen escribirse como #RRGGBB, un byte para cada luz: roja, verde y azul (MDN). #FF0000 es rojo puro: 255 en el primer byte y 0 en los otros dos. #FFFFFF es blanco. El byte más grande, 11111111, es 0xFF, y 0xFF = 15 × 16 + 15 = 255.

La A es 65 porque todos acordaron que lo fuera

Una computadora no tiene idea de lo que es una letra. Guarda un número, y todos acuerdan de antemano qué número representa cada letra. El acuerdo usado en las primeras redes fue ASCII, y RFC 20 lo fijó para ARPANET en 1969. ASCII usa 7 bits, así que tiene 128 códigos. La A mayúscula es 65, la B es 66, y así hasta la Z, que es 90. La a minúscula es 97. Son exactamente 32 más que la A, una diferencia de un solo bit. Los dígitos también son códigos. El carácter 0 es 48, así que el carácter «7» se guarda como 55, no como el número 7.

Cargando

Arrastra para girar. Desplaza o pellizca para acercar.

Los interruptores muestran 01000001, la letra A. Elige otra letra del menú para ver su patrón, o cambia el interruptor 32 para pasar de mayúscula a minúscula.

Por qué una sílaba coreana necesita tres bytes

128 códigos alcanzan de sobra para el inglés y ni de lejos para el coreano, el árabe, el chino o los emojis. Unicode da a cada carácter de los sistemas de escritura del mundo su propio número, llamado punto de código, hasta U+10FFFF. UTF-8 (RFC 3629) es la forma más común de convertir esos números en bytes, con uno a cuatro bytes por carácter. Los 128 caracteres ASCII conservan sus antiguos códigos de un byte, así que un texto simple en inglés es idéntico en ASCII y en UTF-8. La tabla del RFC pone cada punto de código de U+0800 a U+FFFF en la fila de tres bytes, y las sílabas coreanas están en ese rango. Una é con tilde ocupa dos bytes, una sílaba coreana como U+D55C ocupa tres y un emoji como 😀 ocupa cuatro. El primer byte incluso anuncia la longitud. ED es 11101101, y sus tres 1 iniciales dicen que este carácter mide tres bytes.

CarácterPunto de códigoBytes UTF-8 (hex)Bytes
AU+0041411
aU+0061611
éU+00E9C3 A92
Sílaba coreana (U+D55C)U+D55CED 95 9C3
😀U+1F600F0 9F 98 804

El texto ilegible son los bytes correctos leídos con el acuerdo equivocado

Un archivo de texto simple son estos bytes en fila y nada más. La palabra Hello guardada en UTF-8 son cinco bytes: 48 65 6C 6C 6F en hexadecimal, o 72, 101, 108, 108, 111 en decimal. Las dos l son el mismo byte dos veces. Ahora abre ese archivo, o uno en coreano, con el acuerdo equivocado, por ejemplo una antigua codificación coreana o japonesa en lugar de UTF-8. El programa lee exactamente los mismos bytes como caracteres distintos. Nada en el archivo está roto, y al abrirlo otra vez como UTF-8 el texto vuelve.

Adónde fueron los 34 GB que faltan

Como 2 elevado a 10 es 1024, cerca de 1000, durante mucho tiempo se usó «kilobyte» para las dos cosas. En diciembre de 1998 la IEC aprobó nombres separados, y el NIST los recoge: 1 kB son 1000 bytes, pero 1 KiB, un kibibyte, son 1024 bytes; 1 MB son 1 000 000 de bytes, pero 1 MiB son 1 048 576 bytes. Los fabricantes de discos cuentan en potencias de diez. Un disco vendido como de 500 GB guarda 500 000 000 000 bytes. Un sistema operativo que cuenta en potencias de dos divide entre 1 073 741 824 y muestra unos 465.66 GiB. Los aproximadamente 34 que parecen perdidos nunca estuvieron ahí. Los dos números simplemente usan unidades distintas. La diferencia crece con la unidad: un KiB es un 2.4 % mayor que un kB, y un GiB, alrededor de un 7.4 % mayor que un GB.

Errores frecuentes
  • «1 KB son exactamente 1000 bytes en todas partes.» Según el estándar, kB significa 1000 bytes, y 1024 bytes son un KiB. En la práctica los nombres antiguos se siguen usando de las dos maneras. El NIST señala que los fabricantes de memoria suelen llamar megabyte a 2²⁰ bytes, mientras que los de almacenamiento se refieren a 1 000 000, y que el antiguo disquete de «1.44 MB» usaba un tercer megabyte de 1 024 000 bytes. Cuando importa el tamaño exacto, busca la i: KiB, MiB, GiB.
  • «Mi disco de 500 GB llegó con 34 GB de menos.» 500 000 000 000 bytes ÷ 1 073 741 824 ≈ 465.66 GiB. Los mismos bytes, otra unidad. 500 − 465.66 ≈ 34.34, y esa diferencia son los 34 «perdidos».
  • «Un carácter es siempre un byte.» En UTF-8 eso solo se cumple para los 128 caracteres ASCII. La é ocupa 2 bytes, una sílaba coreana 3 y 😀 4, así que un límite contado en bytes se llena unas tres veces más rápido con texto coreano que con texto inglés.
  • «El carácter 7 se guarda como el número 7.» El carácter «7» es el código 55, o 00110111. Un programa que lee «7» de un texto tiene que convertirlo en el número 7 antes de poder hacer cuentas con él.
Nota para docentesEmpieza con bytes en papel, no con definiciones. Escriban Hello, busquen juntos los cinco códigos en una tabla ASCII y solo entonces muestra el hexadecimal. El hexadecimal es donde los estudiantes se traban. Pídeles que escriban un byte como 8 bits, tracen una línea por la mitad y conviertan cada mitad en un dígito, con una pequeña lista 10 = A ... 15 = F al lado. Vale la pena señalar el 32 entre A y a, porque cambiar un solo bit en la escena hace que se quede grabado. Si hay una computadora a mano, guarden una línea en inglés y otra en coreano como archivos de texto UTF-8 y comparen sus tamaños.
  1. ¿Cuánto es 0x41 en decimal?
  2. ¿Cuánto es 0xFF en decimal?
  3. ¿Cuántos bits representa un dígito hexadecimal?
  4. La A es 65 en ASCII. ¿Qué número es la C?
  5. ¿Cuánto mayor es el código de la a que el de la A?
  6. ¿Cuántos códigos tiene el ASCII de 7 bits?
  7. ¿Cuántos bytes ocupa la sílaba coreana U+D55C en UTF-8?
  8. ¿Qué carácter se guarda como 01000010?
    • B
    • A
    • b
    • 2
  9. ¿Cuántos bytes hay en 1 MiB?
  10. Un disco guarda 500 000 000 000 bytes. ¿Cuántos GiB son, aproximadamente? (un decimal)
Ideas clave
  • Un dígito hexadecimal = 4 bits; un byte = dos dígitos hexadecimales (0x00 a 0xFF).
  • ASCII: A = 65, a = 97, 0 = 48; 128 códigos en 7 bits.
  • UTF-8 usa de 1 a 4 bytes por carácter; el texto ASCII no cambia.
  • 1 kB = 1000 B, 1 KiB = 1024 B; 1 MiB = 1 048 576 B.
Fuentes de este curso (9)
  • (checked 2026-10-17; reordered 2026-10-19: standards first, then official documentation, then the teaching model and calculations, history sources last)
  • Standards: NIST, "Prefixes for binary multiples" (physics.nist.gov/cuu/Units/binary.html: IEC approved kibi, mebi, gibi in December 1998; 1 B = 8 bit; 1 MiB = 1 048 576 B; 1 MB = 1 000 000 B; 1 GiB = 1 073 741 824 B; historical note: memory makers usually mean 2²⁰ bytes by megabyte, storage makers 1 000 000, and the "1.44 MB" diskette uses a megabyte of 1 024 000 bytes)
  • IETF RFC 20 "ASCII format for Network Interchange" (1969, 7-bit codes, A = 65, a = 97, 0 = 48)
  • IETF RFC 3629 "UTF-8, a transformation format of ISO 10646" (2003: 1 to 4 octets per character, ASCII unchanged, code points up to U+10FFFF, U+0800 to U+FFFF take three octets, "the first octet of a multi-octet sequence indicates the number of octets", example U+D55C U+AD6D U+C5B4 = ED 95 9C EA B5 AD EC 96 B4)
  • Official documentation: MDN Web Docs, "<color>" (hexadecimal colour notation #RRGGBB)
  • Intel, "Intel Chips" timeline poster (2012: Intel 4004 of 1971 with 2,300 transistors; 2nd generation Core 2010 with 1.16 billion)
  • Claude E. Shannon, "A Symbolic Analysis of Relay and Switching Circuits", Transactions of the AIEE vol. 57 (1938)
  • abstract of his MIT master's thesis. Computer History Museum, The Silicon Engine, "1947: Invention of the Point-Contact Transistor" (Bardeen and Brattain, December 1947, germanium)
  • John von Neumann, "First Draft of a Report on the EDVAC" (30 June 1945, Moore School, reprinted in IEEE Annals of the History of Computing 15:4, 1993).

Fecha de consulta: 2026-10-17