Двоично-текстовое кодирование

Преобразование компьютерных данных в текст

Двоично -текстовое кодирование — это кодирование данных в виде простого текста . Точнее, это кодирование двоичных данных в последовательность печатных символов . Эти кодировки необходимы для передачи данных, когда канал связи не допускает двоичные данные (например, электронная почта или 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 .

Кодирование простого текста

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

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

Используя двоично-текстовое кодирование сообщений, которые уже являются обычным текстом, а затем декодируя их на другом конце, можно сделать такие системы полностью прозрачными . Иногда это называют «бронированием 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, см. ниже.
Base58 в исходном коде оригинального биткоина
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)Двоичный и ASCII80% (аналогично 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.

Смотрите также

Примечания

  1. ^ Кодировка для генерации QR-кода автоматически выбирает кодировку, соответствующую входному набору символов, кодируя 2 буквенно-цифровых символа в 11 бит, а Base45 кодирует 16 бит в 3 таких символа. Таким образом, эффективность составляет 32 бита двоичных данных, закодированных в 33 битах: 97%.
  2. ^ Для произвольных данных; кодирование всех 189 незарезервированных символов тремя байтами, а оставшихся 66 символов — одним.
  3. ^ Для текста; только кодирование каждого из 18 зарезервированных символов.
  4. ^ Один байт хранится как =XX. Кодирует все, кроме 94 символов, которым это не нужно (включая пробел и табуляцию).

Ссылки

  1. ^ Фэлтстрём, Патрик; Люнггрен, Фрейк; Гулик, Дирк-Виллем ван (2022-08-11). «Кодирование данных Base45». Даже в байтовом режиме типичный считыватель QR-кода пытается интерпретировать последовательность байтов как текст, закодированный в UTF-8 или ISO/IEC 8859-1. ... Такие данные необходимо преобразовать в соответствующий текст, прежде чем этот текст можно будет закодировать как QR-код. ... Base45 ... предлагает более компактное кодирование QR-кода.
  2. Дагган, Росс (18 августа 2009 г.). «Кодирование целых чисел по базе 56 в PHP».
  3. ^ Дэйк Хэ; Ю Сун; Чжэнь Цзя; Сюин Юй; Вэй Го; Вэй Хэ; Чао Ци; Сяньхуэй Лу. «Предложение по замене Base85/64 – Base91» (PDF) . Международный институт информатики и системики .
  4. ^ "двоичное кодирование текста в ASCII". basE91 . SourceForge . Получено 2023-03-20 .
  5. ^ "Преобразовать двоичные данные в текст с минимальными накладными расходами". Заметки Воракла . 18 апреля 2020 г.
  6. Альбертсон, Кевин (26 ноября 2016 г.). «Кодирование Base-122».
  7. ^ "BaseXML - для XML1.0+". GitHub . 16 марта 2019 г.
  8. ^ "Биткойн/бипс". Гитхаб . 8 декабря 2021 г.
  9. ^ Расти Рассел и др. (2020-10-15). «Кодирование платежей в репозитории Lightning RFC». GitHub .
  10. ^ "Формат Bech32m для адресов свидетелей v1+". GitHub . 5 декабря 2021 г.
  11. ^ ab RFC  1760 «Система одноразовых паролей S/KEY».
  12. ^ RFC  1751 «Соглашение о 128-битных ключах, читаемых человеком»
  13. ^ "Коды Commodore 64 PETSCII". sta.c64.org .
Retrieved from "https://en.wikipedia.org/w/index.php?title=Binary-to-text_encoding&oldid=1272371658#ASCII_armor"