O armazenamento de dados de texto sem formatação ocupa menos espaço que o armazenamento da mensagem equivalente em binário?

32

Como desenvolvedor web, tenho muito pouco conhecimento de dados binários.

Se eu pegar a frase "Olá, mundo.", Convertê-la em binário e armazená-la como binária em um banco de dados SQL, parece que os 1s e 0s ocupariam mais espaço do que as letras. Parece-me que usar letras seria como usar compressão, onde um símbolo significa múltiplo.

Mas é assim mesmo que funciona?

O armazenamento de dados de texto sem formatação ocupa menos espaço que o armazenamento da mensagem equivalente em binário?

john doe
fonte
126
Você não conhece o mínimo absoluto que todo desenvolvedor precisa saber sobre codificação de caracteres . Felizmente, o fundador deste site escreveu um artigo para você. Leia antes de programar novamente. joelonsoftware.com/2003/10/08/…
Eric Lippert
16
@EricLippert Uma ótima leitura e estou melhor como resultado, obrigado.
João doe
4
Também recomendo utf8everywhere.org
Basile Starynkevitch 27/17/17
2
Ser desenvolvedor da Web não é desculpa para não saber como funciona a codificação de caracteres e os dados binários. Você realmente precisa aprimorar suas habilidades ...
T. Sar - Restabelece Monica

Respostas:

134

Texto simples é binário.

Quando você escreve Hum disco rígido, o cabeçote de gravação não grava duas linhas verticais e uma horizontal no prato, codifica magneticamente os bits 010010001 no prato.

A partir daí, deve ser óbvio que o armazenamento de dados de texto sem formatação ocupa exatamente a mesma quantidade de espaço que o armazenamento de dados binários.

Mas o texto simples é apenas um formato binário em 2

O texto sem formatação pode ser transformado reversivelmente em outros formatos binários. Uma transformação comum é a compactação, que geralmente resulta em uma representação mais compacta, significando menos bits usados ​​para representar a mesma informação.

Dependendo do que você estiver usando o texto sem formatação para representar, você poderá usar diferentes formatos binários para representar as mesmas informações. Isso pode usar mais espaço, pode usar menos.

Por exemplo, os números 5e 1234567podem ser representados em texto sem formatação usando caracteres de dígito, resultando nessas seqüências de bits no disco 3 :

00110101 00000000
00110001 00110010 00110011 00110100 00110101 00110110 00110111 00000000

Como alternativa, você pode usar o complemento de dois bits de 32 bits :

00000000 00000000 00000000 00000101
00000000 00010010 11010110 10000111

Qual é uma representação menos compacta de 5, mas uma representação mais compacta de 1234567.

E há um número literalmente infinito de outras representações que teriam níveis variados de compacidade e flexibilidade, embora, na prática, muito menos do que muitas representações sejam realmente usadas.


1 Assumindo UTF-8. A sequência exata de bits para um caractere depende da codificação específica que você está usando.

2 Ou, na verdade, vários formatos, dadas as várias codificações .

3 Se você está se perguntando quais são esses oito zeros nas extremidades, bem, precisa de uma maneira de saber quanto tempo os dados têm. As opções basicamente se resumem a um marcador (usei isso, via um byte nulo), espaço dedicado ao armazenamento do comprimento (Pascal usou um byte para armazenar o comprimento de uma string) ou um tamanho fixo (usado no complemento subsequente dos dois) exemplo).

8bittree
fonte
6
Uma pequena diferença é a representação do fim de linha, que no Unix / binário ocupa um byte (LF) enquanto no Windows / texto ocupa dois bytes (CR-LF).
Glenn Randers-Pehrson
97
+1 para "a cabeça de gravação não esculpir duas linhas verticais e uma linha horizontal no prato .
Tulains Córdova
@BaardKopperud Você está certo! ;)
Tulains Córdova
2
@BaardKopperud Existe / havia o LightScribe , mas isso não foi feito para a leitura no computador, embora talvez algo como o Google Goggles possa ler alguns rótulos do LightScribe. Mas fazer isso no lado real do armazenamento de dados seria bastante interessante. Lembra-me de músicas que possuem gráficos sofisticados quando executadas em um osciloscópio .
8bittree
2
@ TulainsCórdova Embora, na verdade, as máquinas de Turing operem em um alfabeto arbitrário, portanto, em teoria, elas poderiam escrever letras na fita. Acontece que decidimos usar um alfabeto de dois símbolos.
Gardenhead 27/05
15

Acho isso uma coisa muito divertida de se pensar. Binário não é 1s e 0s na maneira como você fala sobre isso.

Imagine que existe uma quantidade, posso lhe dizer qual é a quantidade de muitas maneiras diferentes:

  • Nine em inglês
  • Neuf em francês
  • 9 em algarismos arábicos
  • IX em algarismos romanos
  • 1001 em binário com algarismos arábicos
  • on off off on em binário com on / off
  • high low low high em binário representado com tensões ou alavancas ou níveis de água ou carga elétrica ... ou palavras em inglês 'alto' e 'baixo'

Todos eles representam a mesma coisa. O ponto aqui é que o binário não é 1s e 0s, é apenas uma maneira de representar um valor.

Quando você fala sobre converter um H em binário, provavelmente imagina ver 10101010 na tela - mas isso não é "binário", é um dígito para cada bit binário.

Sim, se você convertesse Hpara "binário", como as pessoas normalmente falam sobre isso, e representasse isso em dígitos árabes e o armazenasse, seria necessário mais espaço da mesma maneira que a conversão Hparaaitch ocupa mais espaço.

Mas você pode ver que o binário é uma maneira de representar uma quantidade, bem com essa lógica dizendo "se eu convertesse H em binário e o representasse, high low high low high low high lowlevaria 35 caracteres! Isso é ainda mais do que10101010 ! Mas esses dois são 'binários' .. então, como é um maior que o outro?

O outro lado disso é que saber como Hé armazenado por um computador, e ver que Hé em si apenas uma maneira de representar uma quantidade - a mesma quantidade 72, 01001000ou seventy twoou código de caracteres ASCII H. Qual é a resposta da 8bittree de que o texto simples é binário, mas este sou eu tentando mostrar o que isso significa .

Então você tem um pouco de padrão em um computador 01001000e o que isso significa? Qualquer coisa - pode ser falada como um número, como parte de um arquivo zip, como um personagem, depende de qual foi a intenção da pessoa que o criou. Se você sabe que é um texto sem formatação, veio de uma codificação de caracteres H-> 01001000e você procura o contrário na tabela de codificação de caracteres - ASCII, UTF-8, shift-jis, etc. e encontra a fonte correta personagem e sai vem um Hou o que quer. Ou sai o caractere errado se você usar uma pesquisa de codificação diferente da pessoa que o criou. Este é o link de @Eric Lippert.

Mas enquanto eu escrevo isso, e como você pensa sobre isso, Hé um byte e 01001000tem 8 bytes, sim, é mais espaço. E sim, é (uma representação de) binário. Mas está em um nível de abstração mais alto do que o computador está usando - binário exibido em caracteres ASCII, onde cada caractere é representado nos bastidores com um padrão de bits binários, cada um do tamanho de um Húnico.

TessellatingHeckler
fonte
12

O armazenamento de dados de texto sem formatação ocupa menos espaço que o armazenamento da mensagem equivalente em binário?

Não nunca.

Seu computador já armazena os dados de texto sem formatação na representação binária equivalente. Armazenar algo como texto sem formatação versus binário apenas indica como o computador deve interpretar esse fluxo binário idêntico .

Parece-me que usar letras seria como usar compressão, onde um símbolo significa múltiplo.

Isso é meio verdade. Um caractere representará mais de um bit. O problema é que são coisas de tamanhos diferentes. Leva apenas um bit para armazenar 1 ou 0, mas 8 bits (ou mais) para armazenar um caractere de texto sem formatação. Você não ganha nada usando caracteres.

Se alguma coisa , você pode comprimir as coisas de outra maneira. Afinal, 8 bits são 256 possíveis valores diferentes, mas o texto simples geralmente é limitado a letras, números e alguns caracteres de pontuação. Não precisa de tantos bits quanto necessário.

Telastyn
fonte
3
Bem, talvez às vezes :-) Dois casos possíveis em que posso pensar. 1) Você tem uma sequência curta de texto que compacta. O arquivo compactado contém alguns metadados, o que torna o arquivo compactado maior que a string original. 2) Você tem alguns valores de ponto flutuante, digamos 1.2. Armazenar como texto seria de 3 bytes (4 com um terminador), enquanto armazenar um duplo binário levaria 8 bytes.
Jamesqf
5
A resposta realmente depende do que você quer dizer com 'binário'. Por exemplo, o UTF-32 ocupa quatro vezes mais espaço que o ASCII, portanto, se por 'texto simples' você quis dizer ASCII, e por 'binário' você quis dizer UTF-32, o texto simples ocuparia menos espaço que o binário. Mas você pode reverter as definições e obter o resultado oposto.
David Conrad
1
@ DavidConrad Bem, isso apenas contorna o "não existe texto simples". O mais próximo que você tem é um arquivo binário sem metadados / cabeçalhos identificando o tipo e supondo que "deve ser um texto codificado como XXX!". Houve um tempo em que "arquivo de texto simples" significava algo razoável, em um contexto limitado, mas na verdade não existe mais. O melhor que você pode obter é "todos os dados no arquivo são codificados como texto", em contraste com "algumas / todas as partes dos dados não são codificadas como texto".
Luaan