如何把二进制翻译成文本
- 把二进制粘贴到 输入 · 二进制。字节之间可以用空格、换行、逗号、分号或
|分隔,也可以完全不分隔。 - 文本会随着输入实时显示在 输出 · 文本 中。
- 如果看到
�,说明这些比特不是有效的 UTF-8。请在输出下方换一个 字符集 试试,例如 ISO-8859-1。 - 复制输出 复制文本。工具上方的 文本 → 二进制 可以切换方向,也可以使用 文本转二进制。
如何手动读懂二进制
每 8 位一组是一个字节。从左到右给每一位赋值,最左边是 128,依次减半到最右边的 1,再把为 1 的位的值加起来:
| 位 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
|---|---|---|---|---|---|---|---|---|
| 值 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
01001000 是 64 + 8 = 72,ASCII 中的第 72 个字符是 H。01101001 是 64 + 32 + 8 + 1 = 105,即 i。
对于字母,你很少需要真的去算,因为 ASCII 的排列是有规律的。前三位表示字符的种类,对于字母,后五位就是它在字母表中的位置:
| 开头 | 含义 | 示例 |
|---|---|---|
010 | 大写字母 | 01000001 A、01001000 H、01011010 Z |
011 | 小写字母 | 01100001 a、01101001 i、01111010 z |
0011 | 数字 | 00110000 0、00111001 9 |
00100000 | 空格 |
所以 01000011 以 00011 结尾,也就是 3,第三个字母:C。大写和小写只差一位,即左数第三位。
翻译器接受的格式
| 输入 | 读取方式 |
|---|---|
01001000 01101001 | 用空格或换行分隔的 8 位分组 |
01001000,01101001 或 01001000;01101001 | 用逗号、分号或 | 作分隔符 |
0b01001000 0b01101001 | 忽略 0b 前缀 |
1001000 1101001 | 7 位分组,常见于经典的 7 位 ASCII 练习 |
0100100001101001 | 一整串比特,切成 8 位一段 |
它们解码后都是 Hi。短于 8 位的分组也读作一个字节,所以 7 位版本也能用。如果有任何一组超过 8 位,工具会把所有比特连成一个字符串,再切成字节。遇到 0、1 和分隔符以外的字符时,转换会停止并显示出错字符的位置;点击提示旁边的 显示 按钮,即可在输入中选中它。
不是纯 ASCII 的二进制
ASCII 字节总是以 0 开头。以 1 开头的字节属于一个多字节的 UTF-8 字符,它的前几位表示这个序列有多长:
| 字符 | UTF-8 比特 | 规律 |
|---|---|---|
é | 11000011 10101001 | 110 开始一个 2 字节字符,10 表示后续字节 |
€ | 11100010 10000010 10101100 | 1110 开始一个 3 字节字符 |
👋 | 11110000 10011111 10010001 10001011 | 11110 开始一个 4 字节字符 |
如果逐字节解码,你会得到 é 这样的乱码。请让这些字节保持在一起,并把 字符集 保持为 UTF-8。
从二进制到 Base64
二进制、hex 和 Base64 都是书写同一批字节的不同方式。二进制每个字节用 8 个字符,hex 用 2 个,Base64 约 1.33 个,所以各种系统都用 Base64 在文本中传输二进制数据:邮件附件、JSON 字段、data URI。要把比特直接转成 Base64,请使用 二进制转 Base64。要查看 Base64 字符串中的比特,请使用 Base64 转二进制;Base64 的工作原理 展示了它如何把这些比特重新按 6 位一组划分。
在代码中将二进制转为文本
bits = "01001000 01101001"
bytes(int(b, 2) for b in bits.split()).decode("utf-8") # 'Hi'
const bits = "01001000 01101001";
new TextDecoder().decode(Uint8Array.from(bits.split(" "), b => parseInt(b, 2))); // 'Hi'
这两段代码都假设分组之间只隔一个空格;上面的工具对输入格式要宽容得多。
常见问题
01001001 00100000 01101100 01101111 01110110 01100101 00100000 01111001 01101111 01110101 是什么意思?
I love you。每个 8 位分组是一个 ASCII 字符,00100000 是单词之间的空格。
一个字母要用几个二进制位表示?
在纯 ASCII 文本中,任何字母或数字都是八位,即一个字节。在 UTF-8 中,重音字母占 16 位,大多数其他文字占 16 或 24 位,Emoji 占 32 位。
没有空格的二进制能翻译吗?
能。像 0100100001101001 这样的连续字符串会从左开始切成 8 位一段。它的长度必须是 8 的倍数,否则工具会提示找到了多少个比特。
为什么我的二进制翻译出来是乱码?
通常是在没有空格的字符串中少了或多了一个比特,导致后面的每个字节都错位了。如果可以,在字节之间加上空格;这样一个出错的分组只会影响一个字符,其余部分仍能正确读取。