Двоичное кодирование текста - Binary-to-text encoding

А двоичное кодирование текста является кодирование из данные в простой текст. Точнее, это кодирование двоичных данных в последовательности печатные символы. Эти кодировки необходимы для передачи данных, когда канал не допускает двоичных данных (например, электронное письмо или NNTP ) или нет 8-битный чистый. PGP документация (RFC  4880 ) использует термин "ASCII броня"для двоичного кодирования текста при обращении к Base64.

Описание

В ASCII Стандарт кодирования текста использует 128 уникальных значений (0–127) для представления буквенных, цифровых и знаков пунктуации, обычно используемых в английский, плюс выбор коды управления которые не представляют печатные символы. Например, заглавная буква А это символ ASCII 65, цифра 2 ASCII 50, символ } это 125 ASCII, а метасимвол возврат каретки - это ASCII 13. Системы, основанные на ASCII, используют семь битов для представления этих значений в цифровом виде.

Напротив, большинство компьютеров хранят данные в памяти, организованные в восьмибитном формате. байты. Файлы, содержащие машинно-исполняемый код и нетекстовые данные, обычно содержат все 256 возможных восьмибитовых байтовых значений. Многие компьютерные программы стали полагаться на это различие между семибитными текст и восьмибитный двоичный data, и не будет работать должным образом, если символы, отличные от ASCII, появятся в данных, которые, как ожидается, будут включать только текст ASCII. Например, если значение восьмого бита не сохраняется, программа может интерпретировать значение байта выше 127 как флаг, указывающий на выполнение некоторой функции.

Однако часто бывает желательно иметь возможность отправлять нетекстовые данные через текстовые системы, например, когда можно прикрепить файл изображения к сообщению электронной почты. Для этого данные каким-либо образом кодируются, так что восьмибитные данные кодируются в семибитные символы ASCII (обычно с использованием только буквенно-цифровых символов и знаков пунктуации - Печатные символы ASCII ). После безопасного прибытия в пункт назначения он затем декодируется обратно в свою восьмибитную форму. Этот процесс называется двоичным кодированием текста. Многие программы выполняют это преобразование для передачи данных, например PGP и GNU Privacy Guard (GPG).

Кодирование обычного текста

Методы двоичного кодирования в текст также используются в качестве механизма кодирования. простой текст. Например:

  • Некоторые системы имеют более ограниченный набор символов, с которым они могут работать; не только они не 8-битный чистый, некоторые даже не могут обрабатывать каждый печатаемый символ ASCII.
  • В других системах есть ограничения на количество символов, которые могут появляться между разрывы строк, например, ограничение "1000 символов в строке" некоторых SMTP программное обеспечение, как разрешено RFC  2821.
  • Третьи добавляют заголовки или трейлеры к тексту.
  • Несколько плохо оцененных, но все еще используемых протоколов используют внутриполосная сигнализация, вызывая путаницу, если в сообщении появляются определенные шаблоны. Наиболее известной является строка «От» (включая конечный пробел) в начале строки, используемой для разделения почтовых сообщений в mbox формат файла.

Используя двоичное кодирование в текстовых сообщениях, которые уже представляют собой обычный текст, а затем декодируя на другом конце, можно сделать такие системы полностью прозрачный Это иногда называют «бронированием ASCII». Например, компонент ViewState из ASP.NET использует base64 кодирование для безопасной передачи текста через HTTP POST, чтобы избежать коллизия разделителей.

Стандарты кодирования

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

КодированиеТип данныхЭффективностьРеализации языков программированияКомментарии
Ascii85Произвольный80%awk, C, С (2), C #, F #, Идти, Ява Perl, Python, Python (2)Существует несколько вариантов этой кодировки, Base85, btoa и так далее.
Base32Произвольный62.5%ANSI C, Ява, Python 
Base36Целое число~64%трепать, C, C ++, C #, Ява, Perl, PHP, Python, Visual Basic, Swift, многие другиеИспользует арабские цифры 0–9 и Латинские буквы А – Я ( Базовый латинский алфавит ISO ). Обычно используется Перенаправление URL такие системы, как TinyURL или SnipURL / Snipr как компактные буквенно-цифровые идентификаторы.
Base58Целое число~73%C ++, PythonАналогичен Base64, но изменен, чтобы избежать как не буквенно-цифровых символов (+ и /), так и букв, которые могут выглядеть неоднозначно при печати (0 - ноль, I - заглавная i, O - заглавная o и l - строчная L). Сатоши Накамото придумал схему кодирования base58 при создании биткойн.[1] Некоторые системы обмена сообщениями и социальные сети Разрыв строки на не буквенно-цифровых строках. Этого можно избежать, если не использовать Зарезервированные символы URI например +. За сегвит он был заменен на Bech32, см. ниже.
Base58 в исходном коде биткойнов
Bech321 бит (основная или тестовая) плюс от 3 до 40 байтовне простой процент, так как у него 6-байтовый код исправления ошибокC, C ++, JavaScript, Go, Python, Haskell, Ruby, RustТехнические характеристики. Используется в биткойнах и Сеть Lightning.[2]
Base62Аналогичен Base64, но содержит только буквенно-цифровые символы.
Base64Произвольный75%awk, C, С (2), Python, многие другие 
Base85 (RFC  1924 )Произвольный80%C, Python Python (2)Исправленная версия Ascii85.
BinHexПроизвольный75%Perl, C, С (2)MacOS Classic
Десятичная дробьЦелое число~42%Большинство языковОбычно представление по умолчанию для ввода / вывода от / для людей.
Шестнадцатеричный (Base16)Произвольный50%Большинство языковСуществует в верхний регистр и строчная буква варианты
Intel HEXПроизвольный~<50%Библиотека C, C ++Обычно используется для программирования EPROM, NOR-Flash микросхемы памяти
MIMEПроизвольныйУвидеть Цитата для печати и Base64Увидеть Цитата для печати и Base64Контейнер кодирования для форматирования электронной почты
Формат файлов MOS TechnologyПроизвольныйОбычно используется для программирования EPROM, NOR-Flash микросхемы памяти.
Процентное кодированиеТекст (URI ), Произвольный (RFC1738 )~40%[а] (33–70%[b])C, Python, наверное, многие другие 
Цитата для печатиТекст~33–100%[c]Наверное, многиеСохраняет разрывы строк; обрезает строки по 76 символов
S-запись (Motorola шестнадцатеричный)Произвольный49.6%Библиотека C, C ++Обычно используется для программирования EPROM, NOR-Flash микросхемы памяти. 49,6% предполагает 255 двоичных байтов на запись.
Tektronix шестнадцатеричныйПроизвольныйОбычно используется для программирования EPROM, NOR-Flash микросхемы памяти.
UuencodingПроизвольный~60% (до 70% )Perl, C, Ява, наверное, многие другиеВ значительной степени заменен на MIME и yEnc
XxencodingПроизвольный~ 75% (аналогично Uuencoding)CПредлагается (и иногда используется) в качестве замены Uuencoding, чтобы избежать проблем с преобразованием набора символов между системами ASCII и EBCDIC, которые могут повредить данные Uuencoded.
yEncПроизвольные, в основном нетекстовые~98%CВключает контрольную сумму CRC
RFC  1751 (S / KEY )Произвольный33%C,[3] Python, ...

"Конвенция для Человек читаемый 128-битные ключи ". Ряд маленьких английских слов легче читать, запоминать и вводить, чем десятичные или другие системы кодирования двоичного текста.[4]Каждое 64-битное число сопоставляется с шестью короткими словами от одного до четырех символов каждое из общедоступного словаря на 2048 слов.[3]

95 исприн коды с 32 по 126 известны как Печатные символы ASCII.

Некоторые старые и сегодня необычные форматы включают BOO, BTOA, и кодировка USR.

Большинство этих кодировок генерируют текст, содержащий только подмножество всех ASCII печатные символы: например, base64 кодирование генерирует текст, который содержит только прописные и строчные буквы (A – Z, a – z), цифры (0–9) и символы «+», «/» и «=».

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

Некоторые другие кодировки (base64, uuencoding ) основаны на отображении всех возможных последовательностей шести биты на разные печатные символы. Поскольку их больше 26 = 64 печатных символа, это возможно. Данная последовательность байтов транслируется, рассматривая ее как поток битов, разбивая этот поток на блоки по шесть бит и генерируя последовательность соответствующих символов. Различные кодировки различаются отображением между последовательностями битов и символов и форматированием результирующего текста.

Некоторые кодировки (исходная версия BinHex и рекомендуемая кодировка для ШифрСабля ) использовать четыре бита вместо шести, отображая все возможные последовательности из 4 бит на 16 стандартных шестнадцатеричный Использование 4 бита на кодированный символ приводит к увеличению длины вывода на 50% по сравнению с base64, но упрощает кодирование и декодирование - расширение каждого байта в источнике независимо до двух закодированных байтов проще, чем расширение base64 с 3 исходных байтов до 4 закодированных байтов.

Снаружи PETSCII первые 192 кода, 164 имеют видимые изображения в кавычках: 5 (белый), 17–20 и 28–31 (цвета и элементы управления курсором), 32–90 (эквивалент ascii), 91–127 (графика), 129 (оранжевый ), 133–140 (функциональные клавиши), 144–159 (цвета и элементы управления курсором) и 160–192 (графика).[5] Теоретически это разрешает кодирование, такое как base128, между машинами, говорящими на языке PETSCII.

Примечания

  1. ^ Для произвольных данных; кодирует все 189 незарезервированных символов тремя байтами, а оставшиеся 66 символов - одним.
  2. ^ Для текста; кодирует только каждый из 18 зарезервированных символов.
  3. ^ Один байт хранится как = XX. Кодирует все, кроме 94 символов, которые в этом не нуждаются (включая пробел и табуляцию).

использованная литература

  1. ^ «Схема кодирования Base58». Инженерная группа Интернета. 27 ноября 2019 г. Архивировано с оригинал 12 августа 2020 г.. Получено 12 августа, 2020. Спасибо Сатоши Накамото за изобретение формата кодирования Base58.
  2. ^ Расти Рассел; и другие. (2020-10-15). "Кодировка платежа в репозитории Lightning RFC ".
  3. ^ а б RFC  1760 «Система одноразовых паролей S / KEY».
  4. ^ RFC  1751 «Соглашение о 128-битных ключах, удобочитаемых человеком»
  5. ^ http://sta.c64.org/cbm64pet.html и другие