В этой статье есть несколько проблем. Помогите улучшить ее или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти сообщения )
|
Двоично -текстовое кодирование — это кодирование данных в виде простого текста . Точнее, это кодирование двоичных данных в последовательность печатных символов . Эти кодировки необходимы для передачи данных, когда канал связи не допускает двоичные данные (например, электронная почта или NNTP ) или не является 8-битным . В документации PGP ( RFC 4880) термин « ASCII armor » используется для двоично-текстового кодирования применительно к Base64 .
Основная потребность в двоично-текстовом кодировании возникает из-за необходимости передавать произвольные двоичные данные по уже существующим протоколам связи , которые были разработаны для передачи только англоязычного текста , читаемого человеком . Эти протоколы связи могут быть безопасны только для 7 бит (и в пределах этого избегать определенных управляющих кодов ASCII), и могут требовать переносы строк через определенные максимальные интервалы, и могут не поддерживать пробелы . Таким образом, только 94 печатаемых символа ASCII являются «безопасными» для передачи данных.
Стандарт кодировки текста ASCII использует 7 бит для кодирования символов. С его помощью можно кодировать 128 (т. е. 2 7 ) уникальных значений (0–127) для представления алфавитных, цифровых и пунктуационных символов, обычно используемых в английском языке , а также выбор управляющих символов , которые не представляют печатные символы. Например, заглавная буква A представлена 7 битами как 100 0001 2 , 0x41 (101 8 ) , цифра 2 — 011 0010 2 0x32 (62 8 ), символ } — 111 1101 2 0x7D (175 8 ), а управляющий символ RETURN — 000 1101 2 0x0D (15 8 ).
Напротив, большинство компьютеров хранят данные в памяти, организованные в восьмибитные байты . Файлы, содержащие машинно-исполняемый код и нетекстовые данные, обычно содержат все 256 возможных восьмибитных байтовых значений. Многие компьютерные программы стали полагаться на это различие между семибитным текстом и восьмибитными двоичными данными и не будут работать должным образом, если не-ASCII символы появятся в данных, которые, как ожидалось, будут включать только текст ASCII. Например, если значение восьмого бита не сохранено, программа может интерпретировать байтовое значение выше 127 как флаг, сообщающий ей о необходимости выполнить некоторую функцию.
Однако часто желательно иметь возможность отправлять нетекстовые данные через текстовые системы, например, когда можно прикрепить файл изображения к сообщению электронной почты. Для этого данные кодируются каким-либо образом, так что восьмибитные данные кодируются в семибитные символы ASCII (обычно с использованием только буквенно-цифровых и знаков препинания — печатных символов ASCII). После благополучного прибытия в пункт назначения они затем декодируются обратно в восьмибитную форму. Этот процесс называется двоично-текстовым кодированием. Многие программы выполняют это преобразование для обеспечения передачи данных, например, PGP и GNU Privacy Guard .
Методы двоично-текстового кодирования также используются в качестве механизма кодирования простого текста . Например:
Используя двоично-текстовое кодирование сообщений, которые уже являются обычным текстом, а затем декодируя их на другом конце, можно сделать такие системы полностью прозрачными . Иногда это называют «бронированием ASCII». Например, компонент ViewState ASP.NET использует кодировку base64 для безопасной передачи текста через HTTP POST, чтобы избежать коллизии разделителей .
В таблице ниже сравниваются наиболее используемые формы двоично-текстовых кодировок. Эффективность, указанная в таблице, представляет собой отношение количества бит на входе к количеству бит на закодированном выходе.
Кодирование | Тип данных | Эффективность | Реализации языка программирования | Комментарии |
---|---|---|---|---|
Ascii85 | Произвольный | 80% | awk Архивировано 29.12.2014 в Wayback Machine , C, C (2), C#, F#, Go, Java Perl, Python, Python (2) | Существует несколько вариантов этой кодировки: Base85 , btoa и т. д. |
Base32 | Произвольный | 62,5% | ANSI C, Delphi, Go, Java, C# F#, Python | |
Base36 | Целое число | ~64% | bash, C , C++ , C# , Java , Perl , PHP , Python , Visual Basic, Swift и многие другие | Использует арабские цифры 0–9 и латинские буквы A–Z ( базовый латинский алфавит ISO ). Обычно используется системами перенаправления URL, такими как TinyURL или SnipURL/Snipr, в качестве компактных буквенно-цифровых идентификаторов. |
База45 | Произвольный | ~67% (97% [а] ) | Вперёд, Питон | Определено в спецификации IETF RFC 9285 для компактного включения двоичных данных в QR-код . [1] |
Base56 | Целое число | — | PHP, Python, Go | Вариант кодировки Base58, который дополнительно удаляет символы «1» и строчные буквы «o» для минимизации риска мошенничества и человеческих ошибок. [2] |
База58 | Целое число | ~73% | С, С++, Питон, С#, Java | Аналогично Base64, но изменено, чтобы избежать как небуквенно-цифровых символов (+ и /), так и букв, которые могут выглядеть неоднозначно при печати (0 – ноль, I – заглавная i, O – заглавная o и l – строчная L). Base58 используется для представления биткойн- адресов. [ необходима ссылка ] Некоторые системы обмена сообщениями и социальные сети разрывают строки на небуквенно-цифровых строках. Этого можно избежать, не используя зарезервированные символы URI, такие как +. Для SegWit он был заменен на Bech32, см. ниже. |
Base62 | Произвольный | ~74% | Ржавчина, Питон | Аналогично Base64, но содержит только буквенно-цифровые символы. |
Base64 | Произвольный | 75% | awk Архивировано 29.12.2014 в Wayback Machine , C, C (2), Delphi, Go, Python и многие другие | Ранняя и до сих пор популярная кодировка, впервые описанная как часть RFC 989 в 1987 году. |
База85 | Произвольный | 80% | С, Питон, Питон (2) | Переработанная версия Ascii85 . |
База91 [3] | Произвольный | 81% | C# F# | Вариант постоянной ширины |
басE91 [4] | Произвольный | 81% | C, Java, PHP, 8086 Assembly, AWK C#, F#, Rust | Вариант переменной ширины |
База94 [5] | Произвольный | 82% | Питон, Си, Rust | |
База122 [6] | Произвольный | 87,5% | JavaScript, Python, Java, Base125 Python и Javascript, Go, C | |
BaseXML [7] | Произвольный | 83,5% | C Python JavaScript | |
Бех32 | Произвольный | 62,5% + не менее 8 символов (метка, разделитель, 6-символьный ECC ) | C, C++, JavaScript , Go , Python, Haskell , Ruby , Rust | Спецификация. [8] Используется в Bitcoin и Lightning Network . [9] Часть данных кодируется как Base32 с возможностью проверки и исправления до 6 неправильно набранных символов с использованием 6-символьного кода BCH в конце, который также проверяет/исправляет часть, удобочитаемую человеком. Вариант Bech32m имеет тонкое изменение, которое делает его более устойчивым к изменениям длины. [10] |
BinHex | Произвольный | 75% | Perl, C, C (2) | MacOS Классик |
Десятичная дробь | Целое число | ~42% | Большинство языков | Обычно это стандартное представление для ввода/вывода от/к человеку. |
Шестнадцатеричный (Base16) | Произвольный | 50% | Большинство языков | Существует в заглавных и строчных вариантах. |
Intel HEX | Произвольный | ≲50% | Библиотека C, C++ | Обычно используется для программирования микросхем флэш-памяти EPROM , NOR. |
MIME | Произвольный | См. Quoted-printable и Base64 | См. Quoted-printable и Base64 | Контейнер кодирования для форматирования, похожего на электронную почту |
Процентное кодирование | Текст ( URI ), Произвольный (RFC1738) | ~40% [б] (33–70% [в] ) | C, Python, возможно, многие другие | |
Цитируется-печатается | Текст | ~33–100% [д] | Вероятно, многие | Сохраняет переносы строк; обрезает строки по 76 символов |
S-запись (шестнадцатеричная Motorola) | Произвольный | 49,6% | Библиотека C, C++ | Обычно используется для программирования микросхем флэш-памяти EPROM , NOR . 49,6% предполагает 255 двоичных байт на запись. |
Тектроникс шестнадцатеричный | Произвольный | Обычно используется для программирования микросхем флэш-памяти EPROM , NOR . | ||
Uuencoding | Произвольный | ~60% ( до 70% ) | Perl , C, Delphi, Java, Python, возможно, многие другие | Ранняя кодировка, разработанная в 1980 году для Unix-to-Unix Copy . В значительной степени заменена MIME и yEnc |
Xxencoding | Произвольный | ~75% (аналогично Uuencoding) | С, Дельфи | Предлагается (и иногда используется) в качестве замены Uuencoding для избежания проблем с переводом наборов символов между системами ASCII и EBCDIC, которые могут повредить данные в Uuencoded. |
z85 (спецификация ZeroMQ:32/Z85) | Двоичный и ASCII | 80% (аналогично Ascii85/Base85) | C (оригинальный), C#, Dart, Erlang, Go, Lua, Ruby, Rust и другие | Указывает подмножество ASCII, похожее на Ascii85 , опуская несколько символов, которые могут вызывать ошибки программы ( ` \ " ' _ , ; ). Формат соответствует спецификации ZeroMQ:32/Z85. |
RFC 1751 ( S/KEY ) | Произвольный | 33% | С, [11] Питон | «Соглашение о 128-битных ключах , читаемых человеком ». Последовательность коротких английских слов легче для чтения, запоминания и ввода человеком, чем десятичные или другие двоично-текстовые кодировки. [12] Каждое 64-битное число сопоставляется с шестью короткими словами, от одного до четырех символов каждое, из общедоступного словаря на 2048 слов. [11] |
95 кодов isprint от 32 до 126 известны как печатные символы ASCII .
Некоторые старые и сегодня редко используемые форматы включают кодировку BOO, BTOA и USR.
Большинство этих кодировок генерируют текст, содержащий только подмножество всех печатных символов ASCII : например, кодировка base64 генерирует текст, содержащий только заглавные и строчные буквы (A–Z, a–z), цифры (0–9) и символы «+», «/» и «=».
Некоторые из этих кодировок (quoted-printable и percent-coding) основаны на наборе разрешенных символов и одном escape-символе . Разрешенные символы остаются неизменными, в то время как все остальные символы преобразуются в строку, начинающуюся с escape-символа. Этот вид преобразования позволяет сделать полученный текст почти читаемым, поскольку буквы и цифры являются частью разрешенных символов и, следовательно, остаются такими, какие они есть в закодированном тексте. Эти кодировки создают самый короткий простой вывод ASCII для ввода, который в основном является печатным ASCII.
Некоторые другие кодировки ( base64 , uuencoding ) основаны на отображении всех возможных последовательностей из шести бит в различные печатные символы. Поскольку существует более 2 6 = 64 печатных символов, это возможно. Заданная последовательность байтов транслируется путем просмотра ее как потока битов, разбивая этот поток на части по шесть бит и генерируя последовательность соответствующих символов. Различные кодировки отличаются отображением между последовательностями битов и символов и тем, как форматируется результирующий текст.
Некоторые кодировки (исходная версия BinHex и рекомендуемая кодировка для CipherSaber ) используют четыре бита вместо шести, отображая все возможные последовательности из 4 бит на 16 стандартных шестнадцатеричных цифр. Использование 4 бит на закодированный символ приводит к увеличению выходных данных на 50% по сравнению с base64, но упрощает кодирование и декодирование — расширение каждого байта в источнике независимо до двух закодированных байтов проще, чем расширение 3 исходных байтов в base64 до 4 закодированных байтов.
Из первых 192 кодов PETSCII 164 имеют видимое представление при цитировании: 5 (белый), 17–20 и 28–31 (цвета и элементы управления курсором), 32–90 (эквивалент ASCII), 91–127 (графика), 129 (оранжевый), 133–140 (функциональные клавиши), 144–159 (цвета и элементы управления курсором) и 160–192 (графика). [ 13] Это теоретически допускает кодировки, такие как base128, между машинами, говорящими на PETSCII.
Даже в байтовом режиме типичный считыватель QR-кода пытается интерпретировать последовательность байтов как текст, закодированный в UTF-8 или ISO/IEC 8859-1. ... Такие данные необходимо преобразовать в соответствующий текст, прежде чем этот текст можно будет закодировать как QR-код. ... Base45 ... предлагает более компактное кодирование QR-кода.