Из восьмеричной в десятичную: расшифровка режима, маски и старого дампа
Что делает эта конвертация
Инструмент читает значение в основании 8 и пересказывает его в основании 10. Это направление нужно, когда режим уже записан в восьмеричной — как того ждут chmod и ls, — а число должно попасть в скрипт, поле конфигурации или сравнение, где окружающий код рассчитывает на десятичную.
Каждая позиция — степень восьми
Справа налево веса равны 1, 8, 64, 512 и дальше. Переведите 755 и получите 7 × 64 + 5 × 8 + 5 = 493. Обратите внимание: в десятичном виде цифры уже не три независимых права — упакованная структура, делавшая восьмеричную запись читаемой, при переводе растворяется, и об этом стоит помнить до того, как вы воспользуетесь результатом.
Таблица перевода из восьмеричной системы в десятичную
Восьмеричные режимы и маски с их десятичными значениями. Перевод режима прав в десятичную удобен для скриптов, а для чтения лучше оставить его восьмеричным, поэтому большинство команд записывает оба варианта.
| Восьмеричная | Десятичная |
|---|---|
| 0 | 0 |
| 1 | 1 |
| 7 | 7 |
| 10 | 8 |
| 17 | 15 |
| 100 | 64 |
| 377 | 255 |
| 644 | 420 |
| 755 | 493 |
| 1000 | 512 |
Почему восьмеричная сузилась до прав
Система счисления закрепляется там, где совпадает с группировкой машины. Восьмеричная подходила шестибитным и двенадцатибитным словам ранней техники, но как только восьмибитный байт стал всеобщим, естественной группой стали четыре бита, а значит шестнадцатеричная. Права уцелели потому, что они действительно девятибитные и ровно делятся на три группы по три — редкий случай, когда арифметика системы по-прежнему совпадает со структурой данных.
Не считайте права в десятичной
Сложить десятичные 493 и 64, чтобы выдать право на чтение, кажется разумным и таковым не является: 64 — это шестьдесят четыре, и бит, который оно устанавливает в восьмеричном режиме, вовсе не тот бит чтения, который вам нужен. Арифметику прав ведите в восьмеричной, значениями вроде 400 и 40, а переводите только для хранения или показа.
Частые вопросы
Как перевести восьмеричное число в десятичное вручную?
Умножьте каждую цифру на её вес — 1, 8, 64, 512 и дальше справа налево — и сложите результаты. Для 755 это 7 × 64 + 5 × 8 + 5, то есть 448 + 40 + 5, или 493.
Почему chmod 755 показывается в моём скрипте как 493?
Потому что скрипт читает режим как обычное десятичное целое. Файловая система хранит одни и те же биты в любом случае, различается только запись. Держите восьмеричную форму в голове и в комментариях, а перевод делайте на границе, где значение встречается с кодом, который ждёт десятичную.
Какое самое большое восьмеричное значение здесь принимается?
Гораздо больше любого практического режима или маски. Перевод идёт в точной целочисленной арифметике, поэтому длинный ввод возвращается с каждой верной цифрой, а не с округлённым результатом, какой выдал бы калькулятор с плавающей точкой.
Значим ли ведущий ноль в восьмеричной записи?
Численно нет — 0755 и 755 это одно и то же значение, — но он полезен как пометка «здесь восьмеричная», а некоторые языки без него восьмеричный литерал не примут. Конвертер принимает и ведущий ноль, и префикс 0o, а на выводе не печатает ни того, ни другого.
Принимает ли инструмент дроби в восьмеричной?
Да, и честно сообщает, когда дробь непредставима. Одни восьмеричные дроби заканчиваются, другие нет — это зависит от того, является ли знаменатель степенью двойки. Когда разложение не заканчивается, результат усекается и явно помечается, а не округляется так, будто ответ точный.