八进制转十进制转换器_位权展开与权限位解读

按位权展开把八进制换算成十进制:0o755 = 7×64 + 5×8 + 5×1 = 493。页面同时给出二进制 111101101 与 chmod 的权限串 rwxr-xr-x,认 0o 与前导 0 两种前缀,也支持 0o0.1 = 0.125 这样的小数八进制;整数部分一旦超过 17 位,会明确报精度错误而不是给出一个失真的数字。

每 3 位二进制对应 1 位八进制:0o755 → 111 101 101。三位八进制权限分别是属主、属组、其他,每位等于 r(4) + w(2) + x(1)。

输入框按回车立即换算,边输入边算也已开启;输入框被清空时点「开始换算」会自动填回 0o755。对照表共 20 行,默认显示 12 行,点「加载更多」看余下 8 行。

使用方法

  1. 打开页面就有一组完整结果:八进制值默认填 0o755,结果区已经给出十进制 493、二进制 111101101、权限串 rwxr-xr-x 与位权展开式,不需要先填任何东西。
  2. 输入框认两种前缀:ES6 与 Python 2.6 之后的 0o,以及传统 C 风格的前导 0(0755)。裸写 755 同样可以,页面按八进制处理。
  3. 「输出详略」默认完整,会一次给出十进制、二进制、权限串与位权展开四项;改成「仅十进制结果」则只保留换算结果一行,方便直接复制进代码。
  4. 在输入框里按回车立即换算,边输入边算也已开启;改动「输出详略」同样触发重算。
  5. 小数八进制也支持:填 0o0.1 得到 0.125,填 0o0.4 得到 0.5,小数点后第 n 位的权重是 8 的负 n 次方。
  6. 结果区那一行写明本次的十进制值、二进制、权限串与整数位数,并注明是否落在双精度安全整数范围内,是当场算出来的。
  7. 下方对照表共 20 行,默认显示 12 行,点「加载更多」看余下 8 行;「导出 CSV」保存为带字节序标记的文件,「复制对照表」复制制表符分隔文本。
  8. 本页不联网、不写本地存储,刷新即回到默认示例;所有位权展开与权限解读都在当前浏览器本地完成。

这个八进制转十进制转换器能解决什么

八进制在两处最常见:一处是 Unix 的 chmod 权限,另一处是二进制的紧凑写法。这两处的痛点不一样:前者是「777 到底开了哪些权限」说不清,后者是「一串 1 和 0 抄错一位」看不出来。这个八进制转十进制转换器把一次换算拆成四条互相印证的输出——十进制、二进制、权限串、位权展开——任意一条看不懂,都可以用另外三条倒推。

第一类是权限核对。看到同事给的 750,凭记忆容易把它和 755 搞混。页面直接给出 rwxr-x--- 与 rwxr-xr-x 的差别:属组那一段一个是 r-x、一个是 r-x,其他那一段一个是 ---、一个是 r-x。把它粘进变更单,比口头描述可靠得多。

第二类是调试与教学。位权展开把「为什么是这个数」写清楚:0o755 = 7×64 + 5×8 + 5×1 = 493,三个乘积摆在眼前,不需要背公式。反向核对二进制时,每 3 位二进制对应 1 位八进制,111 101 101 一眼就能看出是 7、5、5。

边界必须说清:本页的整数部分超过 17 位时会明确报错,而不是给出一个看起来正常其实已经失真的数字。这是刻意的——JS 的安全整数上限是 2 的 53 次方减 1,8 的 17 次方还在范围内,8 的 18 次方就超了,静默出错比报错危险得多。

位权展开、二进制与权限位

位权展开是换算的定义:从右往左第 i 位(i 从 0 起)的权重是 8 的 i 次方,把每一位的值乘上权重再求和。0o755 的三位分别是 7、5、5,权重是 64、8、1,于是 7×64 + 5×8 + 5×1 = 493。这个方法对任意位数都成立,只是位数多了乘积项会变长。

八进制与二进制之间有一条更省事的关系:因为 8 = 2 的 3 次方,每 3 位二进制恰好合成 1 位八进制。0o755 写成二进制是 111101101,从右往左三位一组就是 111、101、101,对应 7、5、5。这也是八进制至今还被当成二进制紧凑写法的原因——比十六进制更贴近字节以外的位分组习惯。

权限位是三位八进制的经典用法:三位从左到右分别是属主、属组、其他,每一位由 r(4)、w(2)、x(1) 三个标志相加得到。7 = 4+2+1 是 rwx,5 = 4+1 是 r-x,4 是 r--,0 是 ---。于是 755 读作 rwxr-xr-x,644 读作 rw-r--r--,600 读作 rw-------,777 读作 rwxrwxrwx,750 读作 rwxr-x---。写到第 4 位时(例如 1777)出现的是 setuid、setgid、sticky 这些特殊位,1777 里的 sticky 是 /tmp 的常见配置。

前缀写法有三种:0o 是 ES6 与 Python 2.6 之后的写法,0755 是传统 C 的写法,部分汇编里还能见到 755q。需要特别提醒的是,0755 这种前导零写法在现代 JS 的严格模式下是语法错误——ES5 的严格模式禁掉了旧的八进制字面量,因此跨语言搬运时务必带上 0o。

小数八进制按同一套规则往右延伸:小数点后第 n 位的权重是 8 的负 n 次方。于是 0o0.1 = 1/8 = 0.125,0o0.4 = 4/8 = 0.5,0o0.04 = 4/64 = 0.0625。整数部分与小数部分分开计算再相加,小数部分不参与二进制与权限串的解读。

变量含义取值影响
ip整数部分0 ~ 7 的数字,最多 17 位决定十进制整数值与二进制、权限串
fp小数部分0 ~ 7 的数字,可为空按 8 的负 n 次方加权,不参与权限解读
w位权第 i 位为 8 的 i 次方展开式逐项相乘求和
u权限三段属主 / 属组 / 其他每段由 r(4)、w(2)、x(1) 相加
lim安全位数整数部分 17 位以内超过即报精度错误,不输出失真值

完整示例

默认示例是 0o755。整数部分 755 的三位权重分别是 64、8、1,逐项相乘得 448、40、5,相加是 493;二进制按三位一组展开成 111101101;权限串按属主 7、属组 5、其他 5 读作 rwxr-xr-x。四条输出互相印证,任一条算错都能立刻发现。

输入      0o755
十进制    493
二进制    111101101
权限串    rwxr-xr-x(属主 rwx · 属组 r-x · 其他 r-x)
位权展开  7×64 + 5×8 + 5×1 = 493

换成 0o644,十进制变成 420、二进制 110100100、权限串 rw-r--r--;换成 0o1777,十进制是 1023、二进制 1111111111,权限串仍是 rwxrwxrwx,但多出来的第 4 位是 sticky 特殊位。填 0o0.1 这类小数时,页面会略去二进制与权限串两行,只保留十进制 0.125 与小数部分的展开,避免把「半个权限位」这种不成立的说法显示出来。

常见八进制值对照表

下表列出二十个常见八进制值:十进制、二进制、按后三位算出的权限串与一句说明。共 20 行,默认显示 12 行,点工具区的「加载更多」看余下 8 行。权限串一律按十进制值取后九位(即最后三个八进制位)解读。

八进制十进制二进制权限串说明
0o755493111101101rwxr-xr-x目录与可执行文件的常见默认值
0o644420110100100rw-r--r--普通文件的常见默认值
0o600384110000000rw-------仅属主可读写,私钥文件常用
0o777511111111111rwxrwxrwx所有人可读写执行,开放且危险
0o666438110110110rw-rw-rw-所有人可读写但都不可执行
0o400256100000000r--------只读,仅属主可见
0o700448111000000rwx------仅属主有全部权限
0o750488111101000rwxr-x---属主全权限,属组可读可执行
0o177710231111111111rwxrwxrwx含 sticky 特殊位,/tmp 常用
0o1081000-----x---最小的两位八进制值
0o17151111-----xrwx低三位二进制全置一
0o37725511111111-wxrwxrwx一个字节的最大值 255
0o177777655351111111111111111rwxrwxrwx16 位无符号最大值 65535
0o77777772097151111111111111111111111rwxrwxrwx21 位全置一
0o000---------全零
0o111--------x最低位置一
0o77111------rwx低三位全置一
0o7056111000---rwx---执行位整体左移一位
0o100641000000--x------等于十进制 64
0o20012810000000-w-------等于十进制 128

横向读这张表能看出来:0o377 = 255 是一个字节的上界,0o177777 = 65535 是 16 位的上界,它们都是「全 1」形态。日常最常用的是前三行——755、644、600,分别对应可执行、普通文件与私钥这三类场景。

结果边界与错误提示

常见问题

0o 和 0755 两种写法都能用吗?

本页都能认:0o 是 ES6 与 Python 2.6 之后的写法,0755 是传统 C 的前导零写法,裸写 755 也按八进制处理。但要注意 0755 在现代 JS 的严格模式下是语法错误,ES5 严格模式禁掉了旧的八进制字面量,跨语言搬运时建议带上 0o。

为什么 755 是 rwxr-xr-x?

三位八进制分别是属主、属组、其他,每一位由 r(4)、w(2)、x(1) 相加得到。7 = 4+2+1 是 rwx,5 = 4+1 是 r-x,所以 755 读作 rwxr-xr-x:属主可读可写可执行,属组与其他只能读和执行。

17 个 7 还能算准吗?

能。17 个 7 等于 2251799813685247,小于 JS 的安全整数上限 2 的 53 次方减 1,因此落在可精确表示的范围内。整数部分到第 18 位时取值区间的上界就超过了这个上限,页面会直接报错而不是给出失真值。

为什么超过 17 位要报错而不是照算?

因为照算出来的数字看起来完全正常,但末尾几位已经被浮点舍入改掉了,用在权限位或位掩码上会静默出错。报错虽然打断了操作,却把风险暴露在你面前——静默出错比报错危险得多。

小数八进制怎么算?

小数点后第 n 位的权重是 8 的负 n 次方。0o0.1 = 1/8 = 0.125,0o0.4 = 4/8 = 0.5,0o0.04 = 4/64 = 0.0625。整数部分与小数部分分开计算再相加,小数部分不参与二进制与权限串的解读。

权限串只取后三位吗?

是的。对照表里的权限串按十进制值取后九位二进制,也就是最后三个八进制位来解读。像 1777 这样写到第 4 位的,多出来的是 setuid、setgid、sticky 这些特殊位,页面在说明列里标注,不混进九位权限串。

每 3 位二进制对应 1 位八进制有什么用?

用它可以在两种进制之间直接口算:0o755 的每一位换成三位二进制就是 111、101、101,拼起来是 111101101。反过来把二进制从右往左三位一组拆开,也能立刻读回八进制,比先转十进制再除八快得多。

导出的 CSV 带字节序标记吗?

带。对照表 CSV 导出时写入 UTF-8 字节序标记,Excel 双击不乱码;「复制对照表」是制表符分隔文本,粘进表格软件会自动分列,「复制结果」则是纯文本的多行结果。

相关工具