八进制转十进制:解读一个模式、掩码或老转储
这个换算在做什么
它把一个 8 进制值读出来,再用 10 进制复述。当模式已经写成八进制——chmod 和 ls 期望的那种——而这个数字又要进入脚本、配置项或一处默认按十进制理解的比较时,你需要的就是这个方向。
每一位都是 8 的幂
从右往左,权值依次是 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 |
八进制的用武之地为何收窄到权限
一个进制能站稳脚跟,靠的是和机器的分组方式对得上。八进制契合早期硬件的六位和十二位字长,而 8 位字节一旦普及,自然的分组方式就变成了四位,也就是十六进制。权限之所以幸存,是因为它确实是九位宽,能均匀切成三组三位——进制本身的算术依然和数据结构的形状吻合。
不要在十进制里做权限运算
把十进制的 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 前缀,输出时则不会打印。
工具接受八进制小数吗?
接受,而且无法表示时会如实报告。有些八进制小数能终止,有些不能,取决于分母是不是 2 的幂。展开不能终止时结果会被截断并明确标注,而不是当作精确值来四舍五入。