La memorizzazione di dati in testo semplice occupa meno spazio rispetto alla memorizzazione del messaggio equivalente in binario?


32

Come sviluppatore web ho una conoscenza molto scarsa dei dati binari.

Se prendo la frase "Hello world.", La converto in binario e la memorizzo come binaria in un database SQL, sembra che 1 e 0 occupino più spazio delle lettere. Mi sembra che usare le lettere sia come usare la compressione, dove un simbolo sta per multiplo.

Ma è davvero così?

La memorizzazione di dati in testo semplice occupa meno spazio rispetto alla memorizzazione del messaggio equivalente in binario?


126
Non conosci il minimo assoluto che ogni sviluppatore deve conoscere sulla codifica dei caratteri . Fortunatamente il fondatore di questo sito ti ha scritto un articolo. Leggere prima di programmare nuovamente. joelonsoftware.com/2003/10/08/…
Eric Lippert,

16
@EricLippert Ottima lettura e di conseguenza sto meglio grazie.
john doe,


2
Essere uno sviluppatore web non è una scusa per non sapere come funzionano la codifica dei caratteri e i dati binari. Hai davvero bisogno di migliorare le tue abilità ...
T. Sar - Ripristina Monica

Risposte:


134

Il testo in chiaro è binario.

Quando si scrive Hsu un disco rigido, la testina di scrittura non scolpisce due linee verticali e una linea orizzontale nel piatto, ma codifica magneticamente i bit 010010001 nel piatto.

Da lì, dovrebbe essere ovvio che l'archiviazione di dati di testo normale occupa esattamente la stessa quantità di spazio dell'archiviazione di dati binari.

Ma il testo in chiaro è solo un 2 particolare formato binario

Il testo in chiaro può essere trasformato in modo reversibile in altri formati binari. Una trasformazione comune è la compressione che di solito si traduce in una rappresentazione più compatta, il che significa un minor numero di bit utilizzati per rappresentare le stesse informazioni.

A seconda di cosa stai usando il testo in chiaro per rappresentare, potresti essere in grado di usare diversi formati binari per rappresentare le stesse informazioni. Questo può usare più spazio, può usare meno.

Ad esempio, i numeri 5e 1234567potrebbero essere rappresentati in testo normale usando caratteri numerici, risultando in queste sequenze di bit sul disco 3 :

00110101 00000000
00110001 00110010 00110011 00110100 00110101 00110110 00110111 00000000

In alternativa, è possibile utilizzare il complemento a due bit a 32 bit :

00000000 00000000 00000000 00000101
00000000 00010010 11010110 10000111

Che è una rappresentazione meno compatta di 5, ma una rappresentazione più compatta di1234567 .

E c'è un numero letteralmente infinito di altre rappresentazioni che avrebbero vari livelli di compattezza e flessibilità, anche se, in pratica, molto meno di quante sono effettivamente utilizzate molte rappresentazioni.


1 Supponendo UTF-8. L'esatta sequenza di bit per un personaggio dipende dalla codifica specifica che stai utilizzando.

2 O davvero, diversi formati, date le varie codifiche .

3 Se ti stai chiedendo quali siano questi otto zeri alle estremità, beh, hai bisogno di un modo per sapere quanto durano i dati. Le opzioni si riducono sostanzialmente a un marcatore (ho usato questo, tramite un byte null), spazio dedicato alla memorizzazione della lunghezza (Pascal ha utilizzato un byte per memorizzare la lunghezza di una stringa) o una dimensione fissa (utilizzata nel complemento dei due successivi esempio).


6
Una leggera differenza è la rappresentazione di End-of-line, che in Unix / binary richiede un byte (LF) mentre in Windows / text richiede due byte (CR-LF).
Glenn Randers-Pehrson,

97
+1 per "la testina di scrittura non scolpisce due linee verticali e una linea orizzontale nel piatto .
Tulains Córdova,

@BaardKopperud Hai ragione! ;)
Tulains Córdova,

2
@BaardKopperud Esiste / era LightScribe , ma in realtà non era pensato per la lettura da computer, anche se forse qualcosa come Google Goggles poteva leggere alcune etichette LightScribe. Ma farlo sul lato effettivo dell'archiviazione dei dati sarebbe piuttosto interessante. Mi ricorda le canzoni che hanno una grafica fantastica quando passano attraverso un oscilloscopio .
8

2
@ TulainsCórdova Anche se in realtà, le macchine di Turing operano su un alfabeto arbitrario, quindi in teoria potrebbero scrivere lettere sul nastro. Accade così che abbiamo deciso di usare un alfabeto a due simboli.
gardenhead,

15

Trovo che sia una cosa molto divertente a cui pensare. Il binario non è 1 e 0 nel modo in cui ne parli.

Immagina che ci sia una quantità, posso dirti quale quantità è in molti modi diversi:

  • Nine in inglese
  • Neuf in francese
  • 9 in cifre arabe
  • IX in cifre romane
  • 1001 in binario con numeri arabi
  • on off off on in binario con on / off
  • high low low high in binario rappresentato con tensioni o leve o livelli dell'acqua o carica elettrica ... o parole inglesi "alto" e "basso"

Rappresentano tutti la stessa cosa. Il punto qui è che il binario non è 1s e 0s, questo è solo un modo per rappresentare un valore.

Quando parli di convertire una H in binario, probabilmente immagini di vedere 10101010 sullo schermo, ma non è "binario", è una cifra per ogni bit binario.

Sì, se ti convertissi Hin "binario" mentre le persone normalmente ne parlano, e poi lo rappresentassero in cifre arabe e poi lo memorizzassero, occuperebbe più spazio nello stesso modo in cui la conversione Hin aitchoccupa più spazio.

Ma puoi vedere che il binario è un modo di rappresentare una quantità, beh con quella logica che dice "se convertissi H in binario e lo rappresentassi come high low high low high low high lowallora ci vorrebbero 35 caratteri! È anche più di 10101010! Ma questi due sono entrambi" binari " .. quindi come è uno più grande dell'altro?

L'altro lato di questo è di chiedersi come Hè memorizzato da un computer, e di vedere che Hè di per sé solo un modo di rappresentare una quantità - la stessa quantità 72, 01001000o seventy twoo il codice di caratteri ASCII H. Quale è la risposta di 8bittree che il testo in chiaro è binario, ma sono io che sto cercando di mostrare cosa significhi .

Quindi ottieni un po 'di pattern in un computer 01001000e cosa significa? Qualsiasi cosa - potrebbe essere discussa come un numero, come parte di un file zip, come personaggio, dipende dall'intento della persona che lo ha creato. Se sai che dovrebbe essere un testo semplice, allora proviene da una codifica dei caratteri H-> 01001000e lo cerchi nella tabella di codifica dei caratteri - ASCII, UTF-8, shift-jis, ecc. E trova il carattere giusto carattere e fuori arriva un Ho qualunque cosa. Oppure viene fuori il carattere sbagliato se si utilizza una ricerca di codifica diversa rispetto alla persona che l'ha creata utilizzata. Questo è il link di @Eric Lippert.

Ma mentre scrivo questo, e mentre ci pensi, Hè un byte ed 01001000è 8 byte, sì, è più spazio. E sì, è (una rappresentazione di) binario. Ma è ad un livello di astrazione più elevato di quello che il computer sta usando: binario visualizzato in caratteri ASCII, in cui ogni personaggio è rappresentato dietro le quinte con uno schema di bit binario, ciascuno grande quanto il Hsolo.


12

La memorizzazione di dati in testo semplice occupa meno spazio rispetto alla memorizzazione del messaggio equivalente in binario?

No, mai.

Il computer memorizza già i dati di testo normale nella rappresentazione binaria equivalente. Memorizzare qualcosa come testo semplice rispetto a binario indica semplicemente come il computer dovrebbe interpretare quel flusso binario identico .

Mi sembra che usare le lettere sia come usare la compressione, dove un simbolo sta per multiplo.

Questo è un po 'vero. Un personaggio rappresenterà più di un bit. Il problema è che sono cose di dimensioni diverse. Ci vuole solo un bit per memorizzare un 1 o uno 0, ma 8 bit (o più) per memorizzare un carattere di testo semplice. Non guadagni nulla usando i personaggi.

Semmai , puoi comprimere le cose in altro modo. Dopotutto, 8 bit sono 256 possibili diversi valori, ma il testo normale di solito è limitato a lettere, numeri e alcuni caratteri di punteggiatura. Non ha bisogno di tutti i bit necessari.


3
Beh, forse a volte :-) Due possibili casi a cui riesco a pensare. 1) Hai una breve stringa di testo che comprimi. Il file compresso contiene alcuni metadati, il che rende il file compresso più grande della stringa originale. 2) Hai alcuni valori in virgola mobile, diciamo 1.2. La memorizzazione come testo sarebbe di 3 byte (4 con un terminatore), mentre la memorizzazione di un doppio binario richiederebbe 8 byte.
jamesqf,

5
La risposta dipende davvero da cosa intendi per "binario". Ad esempio, UTF-32 occupa quattro volte più spazio ASCII, quindi, se da 'solo testo' si intende ASCII, e da 'binario' che si intende UTF-32, testo normale sarebbe prendere meno spazio di binario. Ma puoi invertire le definizioni e ottenere il risultato opposto.
David Conrad,

1
@DavidConrad Bene, questo si limita a "non esiste un testo semplice". La cosa più vicina a te è un file binario senza metadati / intestazioni che identificano il tipo e indovinano "deve essere codificato come testo come XXX!". C'è stato un tempo in cui "file di testo semplice" significava qualcosa di ragionevole, in un contesto limitato, ma in realtà non lo è più. Il meglio che puoi ottenere è "tutti i dati nel file sono codificati come testo" in contrasto con "alcune / tutte le parti dei dati non sono codificate come testo".
Luaan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.