Перевод текста в восьмеричный код
Кодирование текста в восьмеричные байты и управляющие последовательности C.
Восьмеричное представление текста редко встречается в современном софте, но продолжает жить в управляющих escape-последовательностях, знакомых программистам на C и Unix-оболочках ещё с начала 1970-х годов.
Восьмеричные escape-коды для текста
В языке C и строках оболочки POSIX символ экранирования вместе с числом длиной до трех восьмеричных цифр задает числовое значение одного байта. Если указать после знака экранирования число 102, строка будет содержать латинский символ B. Причина проста: в восьмеричной системе 102 раскладывается как (1 × 64) + (0 × 8) + 2 = 66, а десятичное число 66 в таблице ASCII соответствует именно букве B.
Этот синтаксис появился в самых ранних версиях C в начале 1970-х годов, когда восьмеричная система была привычной частью мышления разработчиков из-за архитектуры тогдашнего аппаратного обеспечения.
Почему шестнадцатеричный формат вытеснил восьмеричный
Для шестнадцатеричного escape-кода всегда нужно ровно два знака, чтобы охватить любой байт от 00 до FF. Восьмеричной последовательности может потребоваться до трех цифр. Более того, незаполненная до фиксированной ширины восьмеричная запись способна случайно поглотить следующую за ней цифру текста.
Шестнадцатеричная система идеально ложится на границы байтов, чего нет у восьмеричной. Из-за этого шестнадцатеричные числа стали стандартом для отображения байтов, а современные анализаторы кода и руководства по стилю рекомендуют избегать восьмеричных последовательностей в пользу шестнадцатеричных или полных кодов Unicode.
Шаги преобразования текста в восьмеричную форму
- Возьми исходный текст и разбей его по одному знаку.
- Определи десятичный числовой код каждого знака.
- Переведи это десятичное число в восьмеричное путем деления на 8, собирая остатки в обратном порядке.
- Дополни полученное значение нулями слева до трех цифр, если формируешь строку для escape-последовательностей.
Сферы применения восьмеричного формата текста
- Чтение старого исходного кода на C или C++, созданного до всеобщего перехода на шестнадцатеричные коды.
- Скрипты командной оболочки POSIX и утилиты вроде
printf, где спецификатор формата %o выводит числа как восьмеричный текст. - Документация к устаревшим встроенным системам, где восьмеричная запись считалась нормой.
- Классические руководства Unix и описания форматов файлов, которые никогда не обновлялись под современные правила.
Вопросы о переводе текста в восьмеричный код
Используется ли восьмеричный текст в форматах файлов сейчас?
Как основной метод кодирования символов — практически нет, хотя архивы POSIX tar до сих пор хранят метаданные заголовков, включая размер файла, в виде строк из восьмеричных цифр.
Сколько восьмеричных цифр требуется для записи одного байта?
До трех цифр, так как три восьмеричных разряда охватывают диапазон от 0 до 511. Этого хватает для диапазона байта от 0 до 255, где старшая цифра ограничена значениями от 0 до 3.
Зачем вставлять восьмеричный код вместо обычного символа?
Обычно это делают для управляющих невидимых символов или знаков, которые трудно ввести с клавиатуры без искажения кодировки в исходном файле.
Одинаков ли синтаксис восьмеричных кодов в C и оболочках?
Общая концепция совпадает, однако допустимое число цифр и способ завершения цепочки символов могут слегка различаться в C, оболочках POSIX и других средах.
Что лучше использовать в новом коде: восьмеричные или шестнадцатеричные коды?
Почти всегда шестнадцатеричные. Они компактнее, четко соответствуют границам байтов и являются стандартом для большинства современных стилей оформления кода.