如何把文本转换为二进制
- 在 输入 · 文本 中输入或粘贴文本。二进制会立即显示在 输出 · 二进制 中。
- 输出下方的 分隔符 决定字节之间放什么:空格、无、
,、,或换行。 - 输入下方的 字符集 决定字符如何变成字节。默认是 UTF-8,对英文文本来说与 ASCII 相同。
- 点击 复制输出 或 下载 保存结果。要转换回来,把二进制粘贴到 二进制转文本,或者使用 二进制 → 文本 切换方向。
一个单词,逐个字母拆解
Hello 的二进制是 01001000 01100101 01101100 01101100 01101111。每一组的来历如下:
| 字母 | 十进制 | 二进制 |
|---|---|---|
H | 72 | 01001000 |
e | 101 | 01100101 |
l | 108 | 01101100 |
l | 108 | 01101100 |
o | 111 | 01101111 |
十进制数是字符的 ASCII 码;二进制是同一个数的二进制写法,补足到 8 位。注意 H 和 h(01101000)只有左起第三位不同。ASCII 中每一对大小写字母都是这样,所以程序只需一次位运算就能转换大小写。
分隔方式
同样的两个字母 Hi,在每种 分隔符 设置下的结果:
| 分隔符 | 输出 |
|---|---|
| 空格 | 01001000 01101001 |
| 无 | 0100100001101001 |
, | 01001000, 01101001 |
, | 01001000,01101001 |
| 换行 | 每行一个字节 |
空格分隔最容易阅读和核对。谜题或协议规范中的位串需要不分隔的形式,但只要丢掉一位,后面的内容就全部错位,所以请保留一份带空格的副本。逗号形式可以粘贴到代码或电子表格单元格中;不过对于真正的源代码,Base64 转字节数组 会生成规范的数组字面量。
ASCII 以外的字符
普通的英文字母、数字和标点各占一个字节。其他字符在 UTF-8 中更长,转换器会写出每一个字节:
| 文本 | 字节数 | 二进制(UTF-8) |
|---|---|---|
ñ | 2 | 11000011 10110001 |
中 | 3 | 11100100 10111000 10101101 |
🙂 | 4 | 11110000 10011111 10011001 10000010 |
切换 字符集,位也会随之改变。在 UTF-16LE 中,Hi 变成 01001000 00000000 01101001 00000000,每个字母两个字节,零字节在后。如果别人对同一段文本给出的二进制与你的不同,首先比较字符集。
文本、二进制和 Base64
二进制是书写字节最直白的方式,也是最长的:每个字节 8 个字符,外加分隔符。Base64 写同样的字节,每个字节只需约 1.33 个字符,所以它被用来在文本格式中携带文件和密钥。Hi 的 Base64 是 SGk=,文本转 Base64 可以直接生成。想看 8 位一组如何重新分成 Base64 使用的 6 位小块,可以用 Base64 转二进制 转换,并阅读 Base64 的工作原理。
在代码中把文本转为二进制
" ".join(f"{b:08b}" for b in "Hi".encode("utf-8")) # '01001000 01101001'
Array.from(new TextEncoder().encode("Hi"),
b => b.toString(2).padStart(8, "0")).join(" "); // '01001000 01101001'
08b 格式和 padStart(8, "0") 负责补前导零。没有它们,H 会输出成 1001000,各组就对不齐了。更多字符串和字节处理见 Python 和 JavaScript 页面。
常见问题
"hello" 的二进制是什么?
01101000 01100101 01101100 01101100 01101111。首字母大写的 Hello 只有第一组变化,变成 01001000。
怎样用二进制写出我的名字?
把名字输入到输入框,复制输出即可。每个字母变成 8 位数字;名和姓之间的空格变成 00100000。中文名字在 UTF-8 中每个字占 3 个字节,也就是 24 位。
为什么每个字符正好是 8 位?
计算机以字节存储文本,一个字节有 8 位。转换器会给每个字节补上前导零,所以 A(65)写成 01000001,而不是 1000001。
为什么有些字符会得到 16 位或 32 位?
因为它们在 UTF-8 中需要不止一个字节。ñ 占两个字节,中 占三个,emoji 占四个。在 UTF-16 中,连普通字母也占两个字节。