Чому base128 не використовується? [зачинено]


90

Чому для передачі двійкових даних в Інтернеті використовується лише base64 замість base128? Набір символів ASCII містить 128 символів, які теоретично можуть представляти базу 128, але в більшості випадків використовується лише base64, але не base128.


60
Чому навіть не 256?
Гамбо

22
Я думаю, справа в тому, щоб мати символи для друку (хоча їх також більше 64 ...)
Фелікс Клінг,

29
Я думаю, що база 128 належала нам деякий час тому. Команда, призначена охороною бази 64, все ще тримається.
Річ Мелтон,

5
чому це питання javascript конкретне? це справедливо і для більшості інших мов, що використовуються в Інтернеті, чи не так?
Бенедикт Вальдвогель

5
@KenRockot: Я бачу, ти усвідомлюєш, що деякі твої 15-розрядні символи будуть закодовані у 3 байти. Ваше кодування base-2048 означає упаковку 11 бітів у 2 байти, що становить 5,5 біта на байти - вдвічі менше, ніж base-64.
maaartinus

Відповіді:


105

Проблема полягає в тому, що принаймні 32 символи набору символів ASCII є "контрольними символами", які можуть інтерпретуватися приймаючим терміналом. Наприклад, є символ BEL (дзвінок), який змушує дзвонити термінал, що приймає. Є символи SOT (початок передачі) та EOT (кінець передачі), які виконують саме те, що випливає з їх назв. І не забувайте символи CR і LF, які можуть мати особливе значення в тому, як структури даних серіалізуються / сплощуються в потік.

Adobe створила кодування Base85, щоб використовувати більше символів у наборі символів ASCII, але AFAIK захищено патентами.


7
Base91 здається хорошим варіантом з відкритим кодом: base91.sourceforge.net
Хорхе

2
Варто врахувати, що потужність 2 базу легше підходить до байтових даних, а кодування простіше. Тоді є портативність; кожна мова має base64 кодування та / або base64 декодування.
Lodewijk

5
Re Base85 та Adobe : відповідь може бути кориснішою, якщо в ній вказані номери патенту та рік видачі. Якщо патенти є проблемою, завжди btoa, яка датується 1990 роком, патенти не обтяжують, і вони безумовно втратять чинність.
agc

65

Оскільки деякі з цих 128 символів не можна надрукувати (в основному ті, що нижче кодової точки 0x20). Тому вони не можуть надійно передаватися у вигляді струни по дроту. І якщо ви перейдете вище кодової точки 128, у вас можуть виникнути проблеми з кодуванням через різні кодування, що використовуються в системах.


8
Base94 існує тут у github, він використовує всі 94 символи ASCII для друку: gist.github.com/iso2022jp/4054241
intrepidis

15

Як уже зазначалося в інших відповідях, ключовим моментом є зменшення набору символів до друкованих . Більш ефективною схемою кодування є basE91, оскільки вона використовує більший набір символів і при цьому уникає символів керування / пробілів у низькому діапазоні ASCII. Веб-сторінка містить приємне порівняння ефективності кодування двійкових файлів проти base64 та basE91 .

Одного разу я прибрав реалізацію Java. Якщо людям цікаво, я можу натиснути на GitHub.

Оновлення : зараз на GitHub .


Мене зацікавить версія Java
Michael Deardeuff


12

Те, що перші 32 символи є контрольними, абсолютно не має значення, оскільки вам не потрібно використовувати їх, щоб отримати 128 символів. У нас є 256 символів на вибір, і лише перші 32 є контрольними символами. Це залишає 192 символи, а отже 128 цілком можливо без використання контрольних символів.

Ось причина: Це повинно бути те, що буде виглядати однаково, і ви зможете скопіювати та вставити незалежно від того, де. Тому це повинні бути символи, які будуть однаково відображатися на будь-якому форумі, у чаті, електронній пошті тощо. Це означає, що ми не можемо використовувати символи, які клієнти форуму / чату / електронної пошти зазвичай можуть використовувати для форматування або ігнорування. Це також повинні бути однакові символи, незалежно від шрифту, мови та регіональних налаштувань.

У цьому причина!


7
Контрольні символи є актуальними, оскільки майже всі вже припускали вашу думку, що це має бути якомога нейтральнішою кодовою сторінкою / кодуванням. Це обов'язково обмежує вас лише (7-бітовим) ASCII, який є підмножиною більшості відповідних кодувань. Крім того, не весь Інтернет є 8-розрядним чистим, і більша частина його є дефакто ASCII. Ваша думка, однак, варто сказати.
Тім Сегін,

7
Просто додам: ASCII визначає лише 128 символів. Символи від 128 до 255 не визначені в ASCII. Оскільки в питанні явно йдеться про ASCII, а не про "будь-яке 8-бітове кодування", усі відповіді обмежуються 128 символами набору ASCII.
pepoluan

На прикладі найпоширенішого кодування UTF-8: байти з 128 по 196 одразу призводять до помилок декодування UTF8; байти на 196 - 256 означатимуть, що наступний байт також має той самий символ, але тоді, якщо наступний байт менше 128, це знову призведе до помилок декодування UTF8. Однак майже у всіх мовах, що чутливі до кодування символів, бібліотека base64 приймає рядки base64 як безпечні для UTF8 рядки. Те саме не можна зробити з base128, оскільки він не може бути закодований як UTF8-безпечний рядок.
SOF,

10

Base64 є загальним, оскільки вирішує різноманітні проблеми (працює майже скрізь, де ви можете подумати)

  • Вам не потрібно турбуватися, чи є транспорт 8-розрядним чистим чи ні.

  • Усі символи в кодуванні можна друкувати. Ви можете їх побачити . Ви можете скопіювати та вставити їх. Ви можете використовувати їх у URL-адресах (певні варіанти). тощо

  • Виправлений розмір кодування. Ви знаєте, що mбайти завжди можуть кодуватися в nбайти.

  • Всі чули про це - він широко підтримується, багато бібліотек, з якими легко взаємодіяти.

Base128 не має всіх цих переваг.

Схоже, він 8-бітний чистий, але нагадаємо, що base64 використовує 65 символів. Без позасмугового символу ви не можете отримати переваги фіксованого розміру кодування. Якщо ви використовуєте позасмуговий символ, ви більше не можете бути 8-бітовим чистим.

Це не все негативно.

  • base128 кодувати / декодувати простіше, ніж base64 - ви просто використовуєте зміни та маски. Може бути важливим для вбудованих реалізацій

  • base128 використовує трохи ефективніше використання транспорту, ніж base64, використовуючи більше доступних бітів.

Люди роблять використання base128 - я використовую його на що - то прямо зараз. Це просто не так часто.


Також пам’ятайте, що системи пошти / новин та їх подібні (а також XML) не завжди добрі до перших 32 кодових точок (розглянемо, наприклад, CR LF проти LF), але в іншому випадку ваша відповідь виглядає дуже добре.
SamB

"що base64 використовує 65 символів." => друкарська помилка чи я щось пропустив?
Кіківа

@Kikiwa, подивись цей зразок Java у Вікіпедії . Перевірте довжину CODESзмінної.
Джон Ла Рой,

О так, символ заповнення '=' лише в кінці корисного набору кодування, ви маєте рацію, дякую.
Кіківа

4

Не впевнений, але я думаю, що нижчі значення (що представляють контрольні коди або щось інше) не надійно передаються як текст / символи всередину HTTP-запитів / відповідей, і значення вище 127 можуть бути мовою / кодовою сторінкою / незалежно від конкретного, тому їх немає 128 різних символів, від яких можна очікувати, що вони працюватимуть у всіх браузерах / платформах.


3

esaji має рацію. Base64 використовується для кодування двійкових даних для передачі за допомогою протоколу, який очікує лише тексту. Це прямо в записі Вікі .


2

Оформити базовий 128 PHP-клас. Кодування та декодування за допомогою набору символів ISO 8859-1.

GoogleCode PHP-Class Base128


1
я хотів би, щоб замість нього використовувався utf-8 ...
Янус Трольсен

1
Базове кодування не має нічого спільного з базовими даними. Ви можете використовувати будь-яке кодування тексту, яке бажаєте, для кодування тексту / даних. Мається на увазі, що таблиця індексу Base ## використовує в якості перекладу набір символів ISO 8859-1 ASCII.
Чад,

1
Це має щось спільне з базовими даними, як тільки ви намагаєтесь вбудувати закодовані в базу двійкові дані в текст. Якщо цей текст закодований в іншому кодуванні, у вас будуть проблеми.
Stijn de Witt

Не існує такого поняття, як набір символів "ISO 8859-1 ASCII". Програма кодує дані, використовуючи 128 різних для друку символів ISO 8859-1. Він не використовує ASCII , будь-яким способом, формою чи формою.
Nisse Engström
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.