Займає чистий текст простого місця менше місця, ніж зберігання еквівалентного повідомлення у двійковій формі?


32

Як веб-розробник я дуже мало розумію бінарні дані.

Якщо я візьму речення "Здрастуйте, світ", перетворять його у бінарне та зберігатиму його як бінарне в базі даних SQL, здається, що 1s та 0s займають більше місця, ніж букви. Мені здається, що використання букв було б подібним до використання стиснення, де один символ означає кілька.

Але чи справді це працює?

Займає чистий текст простого місця менше місця, ніж зберігання еквівалентного повідомлення у двійковій формі?


126
Ви не знаєте абсолютного мінімуму, який повинен знати кожен розробник про кодування символів . На щастя, засновник цього сайту написав вам статтю. Прочитайте його, перш ніж програмувати ще раз. joelonsoftware.com/2003/10/08/…
Ерік Ліпперт

16
@EricLippert Чудовий прочитання, і мені краще в результаті дякую.
John Doe

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
Одна незначна різниця - це представлення кінця рядка, який в Unix / бінарному займає один байт (LF), а в Windows / text - два байти (CR-LF).
Гленн Рендерс-Персон

97
+1 За «голова записі не вирізати дві вертикальні лінії і горизонтальної лінії в таці .
Tulains Córdova

@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 у Бінарному зображеному напругами або важелями, рівнями води або електричним зарядом ... або англійськими словами "високий" та "низький"

Всі вони являють собою одне й те саме. Сенс у тому, що двійкові не є 1s та 0s, це лише один спосіб представлення значення.

Коли ви говорите про перетворення Н у бінарне, ви, мабуть, уявляєте, як на екрані бачите 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і що це означає? Будь-що - можна говорити як про число, як про частину поштового файлу, як про характер, що залежить від наміру людини, яка його створила. Якщо ви знаєте, що це повинен бути звичайний текст, тоді він походить з кодування символів H-> 01001000і ви шукаєте його іншим способом у таблиці кодування символів - ASCII, UTF-8, shift-jis тощо, і знайдете потрібний шрифт характер і виходить Hабо що завгодно. Або виходить неправильний символ, якщо ви використовуєте інший пошук кодування, ніж той, хто його створив. Це посилання на @Eric Lippert.

Але коли я це пишу, і як ви думаєте про це, Hце один байт і 01001000становить 8 байт, так, це більше місця. І так, це (представлення) двійкових. Але це знаходиться на більш високому рівні абстракції, ніж використовує комп'ютер - двійкові відображаються в ASCII символах, де кожен символ представлений поза кадром з бінарним бітовим малюнком, кожен такий же великий, як Hодин.


12

Займає чистий текст простого місця менше місця, ніж зберігання еквівалентного повідомлення у двійковій формі?

Ні ніколи.

Ваш комп'ютер вже зберігає дані простого тексту в еквівалентному бінарному поданні. Збереження чогось як простого тексту проти двійкового просто сигналізує про те, як комп'ютер повинен інтерпретувати той самий ідентичний бінарний потік.

Мені здається, що використання букв було б подібним до використання стиснення, де один символ означає кілька.

Це якось правда. Один символ буде представляти більше одного біта. Проблема полягає в тому, що вони різного розміру. Для збереження символу простого тексту потрібно лише один біт, але 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.