Занимает ли хранение простых текстовых данных меньше места, чем хранение эквивалентного сообщения в двоичном формате


32

Как веб-разработчик, я очень мало разбираюсь в двоичных данных.

Если я возьму предложение «Hello world.», Преобразую его в двоичный файл и сохраню как двоичный файл в базе данных SQL, кажется, что 1 и 0 занимают больше места, чем буквы. Мне кажется, что использование букв будет похоже на сжатие, когда один символ обозначает несколько.

Но так ли это на самом деле?

Занимает ли хранение простых текстовых данных меньше места, чем хранение эквивалентного сообщения в двоичном формате


126
Вы не знаете абсолютного минимума, который каждый разработчик должен знать о кодировке символов . К счастью, основатель этого сайта написал вам статью. Прочитайте это, прежде чем снова программировать. joelonsoftware.com/2003/10/08/…
Эрик Липперт

16
@EricLippert Отличное чтение, и в результате я чувствую себя лучше, спасибо.
Джон

4
Я также рекомендую utf8everywhere.org
Старынкевич

2
Быть веб-разработчиком - не повод, чтобы не знать, как работает кодировка символов и двоичные данные. Вам действительно нужно освежить свои навыки ...
Т. Сар - Восстановить Монику

Ответы:


134

Открытый текст является двоичным.

Когда вы записываете Hна жесткий диск, пишущая головка не вырезает две вертикальные линии и горизонтальную линию в пластине, она магнитным образом кодирует биты 010010001 в пластину.

Оттуда должно быть очевидно, что хранение простых текстовых данных занимает столько же места, сколько и хранение двоичных данных.

Но открытый текст только один 2 отдельный двоичный формат

Открытый текст может быть обратимо преобразован в другие двоичные форматы. Одним из распространенных преобразований является сжатие, которое обычно приводит к более компактному представлению, что означает меньшее количество битов, используемых для представления одной и той же информации.

В зависимости от того, что вы используете для представления открытого текста, вы можете использовать разные двоичные форматы для представления одной и той же информации. Это может занять больше места, это может использовать меньше.

Например, числа 5и 1234567могут быть представлены в виде открытого текста с использованием цифровых символов, что приводит к следующим битовым последовательностям на диске 3 :

00110101 00000000
00110001 00110010 00110011 00110100 00110101 00110110 00110111 00000000

В качестве альтернативы, вы можете использовать 32-битное два дополнения :

00000000 00000000 00000000 00000101
00000000 00010010 11010110 10000111

Что является менее компактным представлением 5, но более компактным представлением 1234567.

И существует буквально бесконечное число других представлений, которые имели бы различные уровни компактности и гибкости, хотя на практике гораздо меньше, чем это фактически используется.


1 Предполагая UTF-8. Точная последовательность битов для символа зависит от того, какую именно кодировку вы используете.

2 Или действительно, несколько форматов, учитывая различные кодировки .

3 Если вам интересно, что представляют собой эти восемь нулей на концах, вам нужен какой-то способ узнать, как долго хранятся данные. Параметры в основном сводятся к маркеру (я использовал это через нулевой байт), пространству, предназначенному для хранения длины (Паскаль использовал байт для хранения длины строки), или к фиксированному размеру (используется в дополнении двух последующих). пример).


6
Одним небольшим отличием является представление End-of-line, которое в Unix / двоичном занимает один байт (LF), а в Windows / текст занимает два байта (CR-LF).
Гленн Рандерс-Персон

97
+1 за "
пишущая

@BaardKopperud Вы правы! ;)
Тулаинс Кордова

2
@BaardKopperud Есть / был LightScribe , но он не был предназначен для чтения с компьютера, хотя, возможно, что-то вроде Google Goggles могло читать некоторые ярлыки LightScribe. Но делать это на стороне фактического хранения данных было бы довольно интересно. Напоминает мне песни, которые имеют причудливую графику при запуске через осциллограф .
8bittree

2
@ TulainsCórdova Хотя на самом деле машины Тьюринга работают с произвольным алфавитом, они теоретически могут писать буквы на ленту. Так получилось, что мы остановились на использовании двухсимвольного алфавита.
садовник

15

Я считаю, что это очень забавная вещь для размышления. Бинарный это не 1 и 0, как вы говорите об этом.

Представьте, что есть количество, я могу сказать вам, каким оно есть, разными способами:

  • Nine по-английски
  • Neuf На французском
  • 9 арабскими цифрами
  • IX римскими цифрами
  • 1001 в двоичном с арабскими цифрами
  • on off off on в двоичном с вкл / выкл
  • high low low high в бинарном виде представлены напряжениями или рычагами или уровнями воды или электрическим зарядом ... или английскими словами 'high' и 'low'

Все они представляют собой одно и то же. Дело в том, что двоичные значения не равны 1 и 0, это только один способ представления значения.

Когда вы говорите о преобразовании H в двоичный, вы, вероятно, представляете, что на экране отображается 10101010 - но это не «двоичный код», это одна цифра для каждого двоичного бита.

Да, если вы преобразуете Hв «двоичный», как обычно говорят об этом люди, а затем представляете, что в арабских цифрах, а затем сохраняете их, это займет больше места так же, как преобразование Hв aitchзанимает больше места.

Но вы можете видеть, что двоичный файл - это один из способов представления величины, хорошо говоря, что логика гласит: «Если бы я преобразовал H в двоичный файл и представил его таким образом, high low high low high low high lowон бы занимал 35 символов! Это даже больше, чем 10101010! Но оба эти значения являются« двоичными » .. так как один больше другого?

Другая сторона этого удивляться тому, как Hхранится на компьютере, и видеть , что Hсама лишь способ представления количество - такое же количество 72, 01001000или seventy twoили код ASCII символов H. Это ответ 8bittree о том, что простой текст является двоичным, но это я пытаюсь показать, что это значит .

Таким образом, вы получаете немного шаблон в компьютере 01001000и что это значит? Все - о чем можно говорить как о числе, как о части zip-файла, как о символе, зависит от намерений человека, который его создал. Если вы знаете, что это должен быть простой текст, то это происходит из кодировки символов H-> 01001000и вы смотрите его в таблице кодировки символов другим способом - ASCII, UTF-8, shift-jis и т. Д. И находите правильный шрифт характер и выход приходит Hили как угодно. Или получится неправильный символ, если вы используете другой поиск кодировки, чем тот, кто его создал. Это ссылка @Eric Lippert.

Но когда я пишу это, и, как вы думаете об этом, Hэто один байт и 010010008 байт, да, это больше места. И да, это (представление) двоичного файла. Но он находится на более высоком уровне абстракции, чем компьютер, - двоичные файлы отображаются в виде символов ASCII, где каждый символ представлен за кулисами с помощью двоичного двоичного шаблона, каждый из которых имеет размер, равный Hодному.


12

Занимает ли хранение простых текстовых данных меньше места, чем хранение эквивалентного сообщения в двоичном формате

Нет никогда.

Ваш компьютер уже хранит текстовые данные в эквивалентном двоичном представлении. Хранение чего-либо в виде простого текста в сравнении с двоичным просто сигнализирует о том, как компьютер должен интерпретировать этот идентичный двоичный поток.

Мне кажется, что использование букв будет похоже на сжатие, когда один символ обозначает несколько.

Это своего рода правда. Один символ будет представлять более одного бита. Проблема в том, что они разных размеров. Для хранения 1 или 0 требуется всего один бит, а для хранения простого текста - 8 бит (или более). Вы ничего не получаете, используя символы.

Во всяком случае , вы можете сжать вещи по-другому. В конце концов, 8 бит - это 256 различных возможных значений, но обычный текст обычно ограничен буквами, цифрами и несколькими знаками препинания. Ему не нужно столько бит, сколько нужно.


3
Ну, может быть, иногда :-) Два возможных случая, которые я могу придумать. 1) У вас есть короткая текстовая строка, которую вы сжимаете. Сжатый файл содержит некоторые метаданные, которые делают сжатый файл больше, чем исходная строка. 2) У вас есть некоторые значения с плавающей точкой, скажем, 1.2. Хранение в виде текста будет 3 байта (4 с разделителем), в то время как хранение двоичного дубля займет 8 байтов.
jamesqf

5
Ответ действительно зависит от того, что вы подразумеваете под «двоичным». Например, UTF-32 занимает в четыре раза больше места, чем ASCII, поэтому, если под «простым текстом» вы подразумевали ASCII, а под «двоичным» вы подразумевали UTF-32, обычный текст занимал бы меньше места, чем двоичный. Но вы можете изменить определения и получить противоположный результат.
Дэвид Конрад

1
@DavidConrad Ну, это просто юбка "нет такого понятия, как простой текст". Самое близкое, что у вас есть, - это двоичный файл без метаданных / заголовков, идентифицирующий тип и предполагающий «должен быть текст, закодированный как XXX!». Было время, когда «простой текстовый файл» означал что-то разумное в ограниченном контексте, но на самом деле это уже не так. Лучшее, что вы можете получить, это «все данные в файле закодированы как текст», в отличие от «некоторые / все части данных не закодированы как текст».
Луаан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.