¿El almacenamiento de datos de texto sin formato ocupa menos espacio que el almacenamiento del mensaje equivalente en binario?


32

Como desarrollador web, entiendo muy poco los datos binarios.

Si tomo la frase "Hola mundo", la convierto a binaria y la almaceno como binaria en una base de datos SQL, parece que los 1 y 0 ocuparían más espacio que las letras. Me parece que usar letras sería como usar compresión, donde un símbolo representa múltiples.

¿Pero es así como funciona realmente?

¿El almacenamiento de datos de texto sin formato ocupa menos espacio que el almacenamiento del mensaje equivalente en binario?


126
No conoce el mínimo absoluto que todo desarrollador debe saber sobre la codificación de caracteres . Afortunadamente, el fundador de este sitio te escribió un artículo. Léalo antes de volver a programar. joelonsoftware.com/2003/10/08/…
Eric Lippert

16
@EricLippert Una gran lectura y estoy mejor como resultado gracias.
John Doe

44
Recomiendo también utf8everywhere.org
Basile Starynkevitch

2
Ser desarrollador web no es una excusa para no saber cómo funcionan la codificación de caracteres y los datos binarios. Realmente necesitas repasar tus habilidades ...
T. Sar - Restablecer a Monica

Respuestas:


134

El texto plano es binario.

Cuando escribe un Hdisco duro, el cabezal de escritura no talla dos líneas verticales y una línea horizontal en el plato, codifica magnéticamente los bits 010010001 en el plato.

A partir de ahí, debería ser obvio que almacenar datos de texto sin formato ocupa exactamente la misma cantidad de espacio que almacenar datos binarios.

Pero el texto plano es solo un formato binario particular 2

El texto sin formato se puede transformar de forma reversible en otros formatos binarios. Una transformación común es la compresión, que generalmente da como resultado una representación más compacta, lo que significa que se utilizan menos bits para representar la misma información.

Dependiendo de lo que esté utilizando para representar el texto sin formato, es posible que pueda usar diferentes formatos binarios para representar la misma información. Esto puede usar más espacio, puede usar menos.

Por ejemplo, los números 5y 1234567podrían representarse en texto sin formato con caracteres de dígitos, lo que da como resultado estas secuencias de bits en el disco 3 :

00110101 00000000
00110001 00110010 00110011 00110100 00110101 00110110 00110111 00000000

Alternativamente, puede usar el complemento de dos de 32 bits :

00000000 00000000 00000000 00000101
00000000 00010010 11010110 10000111

Cuál es una representación menos compacta de 5, pero una representación más compacta de 1234567.

Y hay un número literalmente infinito de otras representaciones que tendrían niveles variables de compacidad y flexibilidad, aunque, en la práctica, se usan mucho menos que muchas representaciones.


1 Suponiendo UTF-8. La secuencia exacta de bits para un personaje depende de la codificación específica que esté utilizando.

2 O realmente, varios formatos, dadas las diversas codificaciones .

3 Si se pregunta cuáles son esos ocho ceros en los extremos, bueno, necesita alguna forma de saber cuánto duran los datos. Las opciones básicamente se reducen a un marcador (usé esto, a través de un byte nulo), espacio dedicado a almacenar la longitud (Pascal usó un byte para almacenar la longitud de una cadena) o un tamaño fijo (utilizado en el complemento de los dos siguientes ejemplo).


66
Una ligera diferencia es la representación de Fin de línea, que en Unix / binario toma un byte (LF) mientras que en Windows / texto toma dos bytes (CR-LF).
Glenn Randers-Pehrson

97
+1 para "el cabezal de escritura no talla dos líneas verticales y una línea horizontal en el plato ."
Tulains Córdova

@BaardKopperud ¡Tienes razón! ;)
Tulains Córdova

2
@BaardKopperud Existe / existía LightScribe , pero eso no estaba realmente destinado a la lectura por computadora, aunque quizás algo así como Google Goggles podría leer algunas etiquetas de LightScribe. Pero hacerlo en el lado del almacenamiento de datos real sería bastante interesante. Me recuerda a las canciones que tienen gráficos elegantes cuando se ejecutan a través de un osciloscopio .
8bittree

2
@ TulainsCórdova Aunque, en realidad, las máquinas de Turing funcionan con un alfabeto arbitrario, por lo que en teoría podrían escribir letras en la cinta. Sucede que hemos decidido usar un alfabeto de dos símbolos.
cabeza de jardín

15

Me parece una gran cosa divertida para pensar. Binario no es 1s y 0s en la forma en que lo hablas.

Imagina que hay una cantidad, puedo decirte qué cantidad es de muchas maneras diferentes:

  • Nine en inglés
  • Neuf en francés
  • 9 en números arábigos
  • IX en números romanos
  • 1001 en binario con números arábigos
  • on off off on en binario con encendido / apagado
  • high low low high en binario representado con voltajes o palancas o niveles de agua o carga eléctrica ... o palabras en inglés 'alto' y 'bajo'

Todos representan lo mismo. El punto aquí es que el binario no es 1s y 0s, esa es solo una forma de representar un valor.

Cuando habla de convertir una H en binario, probablemente imagina ver 10101010 en la pantalla, pero eso no es "binario", es un dígito para cada bit binario.

Sí, si convertiste Ha "binario" como la gente normalmente habla de ello, y luego lo representaste en dígitos arábigos y luego lo almacenaste, ocuparía más espacio de la misma manera que la conversión Ha aitchocupa más espacio.

Pero se puede ver que el binario es una forma de representar una cantidad, bien por esa lógica que dice "si convirtiera H en binario y lo representara como high low high low high low high lowentonces, ¡tomaría 35 caracteres! ¡Eso es aún más 10101010! Pero estos dos son 'binarios' .. Entonces, ¿cómo es uno más grande que el otro?

La otra cara de esto es que preguntarse cómo Hse almacena por un ordenador, y para ver que Hes en sí mismo sólo una forma de representar una cantidad - la misma cantidad 72, 01001000o seventy twoo código de caracteres ASCII H. Cuál es la respuesta de 8bittree de que el texto plano es binario, pero este soy yo tratando de mostrar lo que eso significa .

Entonces obtienes un patrón de bits en una computadora 01001000y ¿qué significa? Cualquier cosa: podría hablarse como un número, como parte de un archivo zip, como un personaje, depende de la intención de la persona que lo creó. Si sabe que se supone que es texto sin formato, proviene de una codificación de caracteres H-> 01001000y lo busca en la tabla de codificación de caracteres: ASCII, UTF-8, shift-jis, etc. y encuentra la fuente correcta personaje y sale un Ho lo que sea. O sale el carácter incorrecto si utiliza una búsqueda de codificación diferente a la utilizada por la persona que la creó. Este es el enlace de @Eric Lippert.

Pero mientras escribo esto, y como lo piensas, Hes un byte y 01001000tiene 8 bytes, sí, eso es más espacio. Y sí, es (una representación de) binario. Pero está en un nivel de abstracción más alto que el que usa la computadora: binario mostrado en caracteres ASCII, donde cada personaje se representa detrás de escena con un patrón de bits binarios, cada uno tan grande como el Húnico.


12

¿El almacenamiento de datos de texto sin formato ocupa menos espacio que el almacenamiento del mensaje equivalente en binario?

No nunca.

Su computadora ya almacena los datos de texto sin formato en la representación binaria equivalente. Almacenar algo como texto sin formato versus binario solo indica cómo la computadora debe interpretar ese flujo binario idéntico .

Me parece que usar letras sería como usar compresión, donde un símbolo representa múltiples.

Eso es un poco cierto. Un personaje representará más de un bit. El problema es que son cosas de diferentes tamaños. Solo se necesita un bit para almacenar un 1 o un 0, pero 8 bits (o más) para almacenar un carácter de texto sin formato. No ganas nada usando personajes.

En todo caso , puede comprimir las cosas de la otra manera. Después de todo, 8 bits son 256 valores posibles diferentes, sin embargo, el texto plano generalmente se limita a letras, números y algunos caracteres de puntuación. No necesita tantos bits como sea necesario.


3
Bueno, tal vez a veces :-) Dos posibles casos en los que puedo pensar. 1) Tiene una cadena de texto corta que comprime. El archivo comprimido contiene algunos metadatos, lo que hace que el archivo comprimido sea más grande que la cadena original. 2) Tiene algunos valores de coma flotante, digamos 1.2. Almacenar como texto sería de 3 bytes (4 con un terminador), mientras que almacenar un doble binario tomaría 8 bytes.
jamesqf

55
La respuesta realmente depende de lo que quiere decir con "binario". Por ejemplo, UTF-32 ocupa cuatro veces tanto espacio como ASCII, por lo que si por 'texto plano' que quería decir ASCII, y por 'binario' que significaba UTF-32, texto plano podría tomar menos espacio que el binario. Pero puede revertir las definiciones y obtener el resultado opuesto.
David Conrad

1
@DavidConrad Bueno, eso simplemente bordea el "no hay tal cosa como texto sin formato". Lo más parecido que tiene es un archivo binario sin metadatos / encabezados que identifique el tipo y adivine "¡debe estar codificado como XXX!". Ha habido un momento en que "archivo de texto sin formato" significaba algo razonable, en un contexto limitado, pero en realidad ya no lo es. Lo mejor que puede obtener es "todos los datos del archivo están codificados como texto" en contraste con "algunas / todas las partes de los datos no están codificadas como texto".
Luaan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.