Le stockage de données en texte brut prend-il moins d'espace que le stockage du message équivalent en binaire?

32

En tant que développeur Web, j'ai très peu de compréhension des données binaires.

Si je prends la phrase "Hello world.", La convertis en binaire et la stocke comme binaire dans une base de données SQL, il semble que les 1 et les 0 occupent plus d'espace que les lettres. Il me semble que l’utilisation de lettres équivaudrait en quelque sorte à l’utilisation de la compression, où un symbole représente plusieurs.

Mais est-ce vraiment comme ça que ça marche?

Le stockage de données en texte brut prend-il moins d'espace que le stockage du message équivalent en binaire?

John Doe
la source
126
Vous ne connaissez pas le minimum absolu que chaque développeur doit connaître sur le codage de caractères . Heureusement, le fondateur de ce site vous a écrit un article. Lisez-le avant de programmer à nouveau. joelonsoftware.com/2003/10/08/…
Eric Lippert
16
@EricLippert Une excellente lecture et je suis mieux loti en conséquence merci.
john doe
4
Je recommande également utf8everywhere.org
Basile Starynkevitch
2
Être développeur Web n'est pas une excuse pour ne pas savoir comment fonctionne l'encodage de caractères et les données binaires. Vous avez vraiment besoin de parfaire vos compétences ...
T. Sar - Réintégrer Monica

Réponses:

134

Le texte en clair est binaire.

Lorsque vous écrivez Hun disque dur sur un disque dur, la tête d’écriture ne sculpte pas deux lignes verticales et une ligne horizontale dans le plateau, elle code magnétiquement les bits 010010001 dans le plateau.

À partir de là, il devrait être évident que le stockage de données en texte brut occupe exactement la même quantité d’espace que le stockage de données binaires.

Mais le texte en clair est juste un 2 format binaire particulier

Le texte en clair peut être transformé de manière réversible en d’autres formats binaires. La compression est une transformation courante qui donne généralement une représentation plus compacte, ce qui signifie que moins de bits sont utilisés pour représenter la même information.

Selon ce que vous utilisez pour représenter le texte en clair, vous pourrez peut-être utiliser différents formats binaires pour représenter la même information. Cela peut utiliser plus d'espace, il peut en utiliser moins.

Par exemple, les nombres 5et 1234567pourraient être représentés en texte clair à l'aide de caractères numériques, ce qui donne les séquences de bits suivantes sur le disque 3 :

00110101 00000000
00110001 00110010 00110011 00110100 00110101 00110110 00110111 00000000

Vous pouvez également utiliser le complément à deux bits 32 bits :

00000000 00000000 00000000 00000101
00000000 00010010 11010110 10000111

Ce qui est une représentation moins compacte de 5, mais plus compacte 1234567.

Et il existe un nombre littéralement infini d’autres représentations qui auraient divers degrés de compacité et de souplesse, bien que, dans la pratique, elles soient beaucoup moins utilisées que cela.


1 En supposant UTF-8. La séquence exacte de bits d'un caractère dépend de l'encodage spécifique que vous utilisez.

2 Ou vraiment, plusieurs formats, étant donné les différents encodages .

3 Si vous vous demandez ce que sont ces huit zéros aux extrémités, eh bien, vous avez besoin d’un moyen de savoir combien de temps les données sont. Les options se résument en gros à un marqueur (j'ai utilisé cela, via un octet nul), un espace dédié au stockage de la longueur (Pascal a utilisé un octet pour stocker la longueur d'une chaîne), ou une taille fixe (utilisée dans le complément à deux suivant Exemple).

8bittree
la source
6
Une légère différence est la représentation de la fin de ligne, qui sous Unix / binary prend un octet (LF) alors que dans Windows / texte prend deux octets (CR-LF).
Glenn Randers-Pehrson
97
+1 pour "la tête d'écriture ne sculpte pas deux lignes verticales et une ligne horizontale dans le plateau .
Tulains Córdova
@BaardKopperud Vous avez raison! ;)
Tulains Córdova
2
@BaardKopperud Il y avait / était LightScribe , mais ce n'était pas vraiment destiné à la lecture sur ordinateur, bien que quelque chose comme Google Goggles pourrait peut-être lire certaines étiquettes LightScribe. Mais faire cela du côté du stockage de données serait assez intéressant. Cela me rappelle des chansons qui ont des graphismes sophistiqués lorsqu'elles sont passées sur un oscilloscope .
8bittree
2
@ TulainsCórdova Bien qu'en réalité, les machines de Turing fonctionnent sur un alphabet arbitraire, elles pouvaient donc théoriquement écrire des lettres sur la bande. Il se trouve que nous avons opté pour un alphabet à deux symboles.
Gardenhead
15

Je trouve cela très amusant de réfléchir. Le binaire n'est pas un 1 ni un 0 dans la façon dont vous en parlez.

Imaginez qu'il y ait une quantité, je peux vous dire quelle est la quantité de différentes façons:

  • Nine en anglais
  • Neuf en français
  • 9 en chiffres arabes
  • IX en chiffres romains
  • 1001 en binaire avec chiffres arabes
  • on off off on en binaire avec on / off
  • high low low high en binaire représenté avec des tensions ou des leviers ou des niveaux d'eau ou une charge électrique ... ou des mots anglais «haut» et «bas»

Ils représentent tous la même chose. Le point ici est que le binaire n'est pas 1 et 0, ce n'est qu'une façon de représenter une valeur.

Lorsque vous parlez de convertir un H en binaire, vous imaginez probablement voir 10101010 à l'écran - mais ce n'est pas "binaire", c'est un chiffre pour chaque bit binaire.

Oui, si vous convertissez Hen "binaire" comme le font normalement les gens, puis que vous le représentez en chiffres arabes, puis que vous le stockez, cela prend plus d'espace de la même manière que la conversion Hen aitchprend plus d'espace.

Mais vous pouvez voir que le binaire est une façon de représenter une quantité, et bien par cette logique qui dit "si je convertis H en binaire et le représente comme high low high low high low high lowcela prendrait 35 caractères! C'est encore plus que 10101010! Mais ces deux sont tous les deux" binaires " .. alors comment l'un est-il plus grand que l'autre?

L'autre côté de cela est de se demander comment Hest stockée par un ordinateur, et de voir que Hlui - même est juste une façon de représenter une quantité - la même quantité 72, 01001000ou seventy twoou un code de caractères ASCII H. La réponse de 8bittree est que le texte brut est binaire, mais c'est moi qui essaie de montrer ce que cela signifie .

Donc, vous obtenez un motif peu dans un ordinateur 01001000et qu'est-ce que cela signifie? N'importe quoi - pourrait être considéré comme un nombre, comme une partie d'un fichier zip, comme un personnage, dépend de l'intention de la personne qui l'a créé. Si vous savez qu'il est censé être du texte brut, il provient d'un codage de caractères H-> 01001000et vous le regardez dans le sens opposé dans la table de codage de caractères - ASCII, UTF-8, shift-jis, etc. et vous recherchez la bonne police. caractère et sort un Hou quoi. Si vous utilisez une recherche de codage différente de celle de la personne qui l'a créée, le mauvais caractère apparaît. C'est le lien de @Eric Lippert.

Mais au moment où j'écris ceci, et à mesure que vous y réfléchissez, Hun octet sur 010010008 octets, oui, c'est plus d'espace. Et oui c'est (une représentation de) binaire. Mais il est à un niveau d'abstraction plus élevé que celui utilisé par l'ordinateur - affichage binaire en caractères ASCII, où chaque caractère est représenté dans les coulisses avec un motif binaire, aussi gros que le Hseul.

TessellatingHeckler
la source
12

Le stockage de données en texte brut prend-il moins d'espace que le stockage du message équivalent en binaire?

Non jamais.

Votre ordinateur stocke déjà les données en texte brut dans la représentation binaire équivalente. Stocker quelque chose en tant que texte brut ou binaire indique simplement comment l’ordinateur doit interpréter ce flux binaire identique .

Il me semble que l’utilisation de lettres équivaudrait en quelque sorte à l’utilisation de la compression, où un symbole représente plusieurs.

C'est un peu vrai. Un caractère représentera plus d'un bit. Le problème est que ce sont des choses de tailles différentes. Il ne faut qu'un bit pour stocker un 1 ou un 0, mais 8 bits (ou plus) pour stocker un caractère en texte brut. Vous ne gagnez rien en utilisant des personnages.

Si quelque chose , vous pouvez compresser les choses dans l'autre sens. Après tout, 8 bits correspondent à 256 valeurs possibles différentes, mais le texte brut est généralement limité à des lettres, des chiffres et quelques caractères de ponctuation. Il n'a pas besoin d'autant de bits que nécessaire.

Telastyn
la source
3
Eh bien, peut-être parfois :-) Deux cas possibles auxquels je peux penser. 1) Vous avez une courte chaîne de texte que vous compressez. Le fichier compressé contient des métadonnées, ce qui rend le fichier compressé plus volumineux que la chaîne d'origine. 2) Vous avez des valeurs en virgule flottante, par exemple 1.2. Stocker en tant que texte consisterait en 3 octets (4 avec un terminateur), tandis que stocker un double binaire prendrait 8 octets.
jamesqf
5
La réponse dépend vraiment de ce que vous entendez par «binaire». Par exemple, UTF-32 prend quatre fois plus d' espace ASCII, donc si par « texte brut » que vous vouliez dire ASCII, et par « binaire » signifie que vous UTF-32, le texte brut serait prendre moins d' espace que binaire. Mais vous pouvez inverser les définitions et obtenir le résultat opposé.
David Conrad
1
@ DavidConrad Eh bien, cela ne fait que survoler le "il n’existe pas de texte brut". La chose la plus proche que vous avez est un fichier binaire sans métadonnées / en-têtes identifiant le type et devinant "doit être codé en texte comme XXX!". Il fut un temps où «fichier texte brut» signifiait quelque chose de raisonnable, dans un contexte limité, mais ce n'est plus vraiment le cas. Le mieux que vous puissiez obtenir est "toutes les données du fichier sont codées sous forme de texte", par opposition à "certaines / toutes les parties des données ne sont pas codées sous forme de texte".
Luaan