A двоичное-текстовое кодирование - это кодирование из данных в обычном тексте. Точнее, это кодирование двоичных данных в последовательности печатаемых символов. Эти кодировки необходимы для передачи данных, когда канал не поддерживает двоичные данные (например, электронная почта или NNTP ) или не является 8-битным чистым. В документации PGP (RFC 4880 ) используется термин «ASCII armor » для двоичного кодирования текста при ссылке на Base64.
The ASCII стандарт кодирования текста использует 128 уникальных значений (0–127) для представления буквенных, цифровых и знаков пунктуации, обычно используемых в английском языке, плюс набор управляющих кодов, которые не представляют печатные символы. Например, заглавная буква A - это символ ASCII 65, цифра 2 - это ASCII 50, символ} - это ASCII 125, а метасимвол возврат каретки - это ASCII 13. Системы, основанные на ASCII, используют семь битов для представления эти значения в цифровом виде.
Напротив, большинство компьютеров хранят данные в памяти, организованные в восьмибитные байты. Файлы, содержащие машинно-исполняемый код и нетекстовые данные, обычно содержат все 256 возможных восьмибитовых байтовых значений. Многие компьютерные программы стали полагаться на это различие между семибитным текстом и восьмиразрядными двоичными данными и не будут работать должным образом, если в данных, которые, как ожидается, будут включать только текст ASCII, будут появляться символы, отличные от ASCII. Например, если значение восьмого бита не сохраняется, программа может интерпретировать значение байта выше 127 как флаг, указывающий на выполнение некоторой функции.
Однако часто бывает желательно иметь возможность отправлять нетекстовые данные через текстовые системы, например, когда можно прикрепить файл изображения к сообщению электронной почты. Для этого данные каким-то образом кодируются, так что восьмибитные данные кодируются в семибитные символы ASCII (обычно с использованием только буквенно-цифровых символов и знаков пунктуации - печатаемых символов ASCII ). После безопасного прибытия в пункт назначения он затем декодируется обратно в свою восьмибитную форму. Этот процесс называется двоичным кодированием текста. Многие программы выполняют это преобразование, чтобы разрешить передачу данных, например, PGP и GNU Privacy Guard (GPG).
Методы двоичного кодирования в текст также используются в качестве механизма кодирования обычного текста. Например:
С помощью кодирования двоичного кода в текст для сообщений, которые уже представляют собой обычный текст, а затем декодирования на другом конце, можно сделать такие системы полностью прозрачными. Иногда это называют «бронированием ASCII». Например, компонент ViewState в ASP.NET использует кодировку base64 для безопасной передачи текста через HTTP POST, чтобы избежать столкновения разделителей .
В таблице ниже сравниваются наиболее часто используемые формы двоичного кодирования текста. Указанная эффективность - это соотношение между количеством бит на входе и количеством бит в закодированном выходе.
Кодирование | Тип данных | Эффективность | Реализации языка программирования | Комментарии |
---|---|---|---|---|
Ascii85 | Произвольный | 80 % | awk, C, C (2), C#, F#, Go, Java Perl, Python, Python (2) | Существует несколько вариантов эта кодировка, Base85, btoa и так далее. |
Base32 | Произвольный | 62,5% | ANSI C, Java, Python | |
Base36 | Integer | ~ 64% | bash, C, C ++, C#, Java, Perl, PHP, Python, Visual Basic, Swift, многие другие | Использует арабские цифры 0–9 и латинские буквы A – Z (Базовый латинский алфавит ISO ). Обычно используется системами перенаправления URL, такими как TinyURL или SnipURL / Snipr, в качестве компактных буквенно-цифровых идентификаторов. |
Base58 | Integer | ~ 73% | C ++, Python | Подобно Base64, но изменено, чтобы избежать использования не буквенно-цифровых символов (+ и /) и буквы, которые могут выглядеть неоднозначно при печати (0 - ноль, I - заглавная i, O - заглавная o и l - строчная L). Сатоши Накамото изобрел схему кодирования base58 при создании биткойна. Некоторые системы обмена сообщениями и социальных сетей перенос строки в строках, отличных от буквенно-цифровых. Этого можно избежать, если не использовать зарезервированные символы URI, такие как +. Для segwit он был заменен на Bech32, см. Ниже. Base58 в исходном коде биткойнов |
Bech32 | 1 бит (основная или тестовая) плюс от 3 до 40 байтов | не простой процент, поскольку он имеет 6-байтовый код исправления ошибок | C, C ++, JavaScript, Go, Python, Haskell, Ruby, Rust | Спецификация. Используется в биткойнах и Lightning Network. |
Base62 | Аналогично Base64, но содержит только буквенно-цифровые символы. | |||
Base64 | Произвольно | 75% | awk, C, C (2), Python, многие другие | |
Base85 (RFC 1924 ) | Произвольный | 80% | C, Python Python (2) | Исправленная версия Ascii85. |
BinHex | Произвольный | 75% | Perl, C, C (2) | MacOS Classic |
Десятичное | Целое | ~42% | Большинство языков | Обычно представление по умолчанию для ввода / вывода от / для людей. |
Шестнадцатеричный (Base16) | Произвольный | 50% | Большинство языков | Имеется в верхнем регистре и строчные варианты |
Intel HEX | Произвольная | ~<50% | библиотека C, C ++ | Обычно используется для программирования EPROM, NOR-Flash микросхемы памяти |
MIME | Произвольный | См. Цитируемая печать и Base64 | См. Цитированная печать и Base64 | Контейнер кодирования для форматирования электронной почты |
Формат файла технологии MOS | Произвольный | Обычно используется для программирования EPROM, NOR-Flash памяти чипсы. | ||
Процентное кодирование | Текст (URI ), Произвольный (RFC1738 ) | ~ 40% (33–70%) | C, Python, возможно многие другие | |
Печать в кавычках | Текст | ~ 33–100% | Возможно много | Сохраняет разрывы строк; обрезает строки по 76 символов |
S-запись (Motorola hex) | Произвольный | 49,6% | Библиотека C, C ++ | Обычно используется для программирования EPROM, Микросхемы памяти NOR-Flash. 49,6% предполагает 255 двоичных байтов на запись. |
Tektronix hex | Произвольный | Обычно используется для программирования EPROM, NOR-Flash микросхемы памяти. | ||
Uuencoding | Произвольное | ~ 60% (до 70% ) | Perl, C, Java, возможно многие другие | В значительной степени заменено на MIME и yEnc |
Xxencoding | Arbitrary | ~ 75% (аналогично Uuencoding) | C | Предлагается (и иногда используется) в качестве замены Uuencoding, чтобы избежать проблем с преобразованием набора символов между ASCII и системы EBCDIC, которые могли повредить Uuencoded data |
yEnc | Arbitrary, m в основном нетекстовые | ~ 98% | C | Включает контрольную сумму CRC |
RFC 1751 (S / KEY ) | Произвольный | 33% | C,Python,... | «Соглашение для удобочитаемых 128-битных ключей». Ряд маленьких английских слов легче читать, запоминать и набирать, чем десятичные или другие системы кодирования двоичного текста. Каждое 64-битное число преобразуется в шесть коротких слов, от одного до четырех символов каждое, из общедоступного словаря из 2048 слов. |
95 isprint коды с 32 по 126 известны как Печатные символы ASCII.
Некоторые старые и сегодня редко встречающиеся форматы включают BOO, BTOA и кодировку USR.
Большинство этих кодировок генерируют текст, содержащий только подмножество всех печатаемых символов ASCII : например, кодировка base64 генерирует текст, который содержит только верхний и нижний регистры. буквы, (A – Z, a – z), цифры (0–9) и символы «+», «/» и «=».
Некоторые из этих кодировок (печатаемые в кавычках и процентное кодирование) основаны на наборе разрешенных символов и одном escape-символе . Допустимые символы остаются неизменными, а все остальные символы преобразуются в строку, начинающуюся с escape-символа. Такое преобразование позволяет полученному тексту быть почти читаемым, поскольку буквы и цифры являются частью разрешенных символов и поэтому остаются такими, как они есть в закодированном тексте. Эти кодировки обеспечивают самый короткий простой вывод ASCII для ввода, который в основном является печатаемым ASCII.
Некоторые другие кодировки (base64, uuencoding ) основаны на отображении всех возможных последовательностей из шести бит в различные печатаемые символы. Поскольку имеется более 2 = 64 печатных символа, это возможно. Данная последовательность байтов транслируется, рассматривая ее как поток битов, разбивая этот поток на куски по шесть бит и генерируя последовательность соответствующих символов. Различные кодировки различаются отображением между последовательностями битов и символов и форматированием результирующего текста.
Некоторые кодировки (исходная версия BinHex и рекомендуемая кодировка для CipherSaber ) используют четыре бита вместо шести, отображая все возможные последовательности из 4 бит в 16 стандартных шестнадцатеричных цифр. Использование 4 бита на кодированный символ приводит к увеличению длины вывода на 50% по сравнению с base64, но упрощает кодирование и декодирование - расширение каждого байта в источнике независимо до двух закодированных байтов проще, чем расширение base64 с 3 исходных байтов до 4 закодированных байтов.
Из первых 192 кодов PETSCII, 164 имеют видимые изображения в кавычках: 5 (белый), 17–20 и 28–31 (цвета и элементы управления курсором), 32–90 (эквивалент ascii), 91–127 (графика), 129 (оранжевый), 133–140 (функциональные клавиши), 144–159 (цвета и элементы управления курсором) и 160–192 (графика). Теоретически это разрешает кодирование, такое как base128, между машинами, говорящими на языке PETSCII.