Crockford Base32 编码解码

将文本、十六进制字节或文件转换为 Douglas Crockford 设计的 Base32,也可以反向解码。解码器能容忍输入错误:忽略大小写和连字符,并把 O 读作 0、把 I 或 L 读作 1。

完全在浏览器中运行,不会上传任何数据。

使用方法

  1. 选择“编码”把文本转换为 Crockford Base32,或选择“解码”把它还原为文本。
  2. 保持选择 Crockford 变体,并确认“填充”已关闭。如果需要小写输出,可以勾选“小写”。
  3. 输入或粘贴内容,也可以打开文件。解码时会忽略连字符和空格。
  4. 复制结果,或将结果下载为文件。

什么是 Crockford Base32?

Douglas Crockford 设计这套 Base32 字母表,是为了让标识符便于人工阅读、输入和口头传达。它由 10 个数字和 22 个大写字母组成:0123456789ABCDEFGHJKMNPQRSTVWXYZ。去掉 I 和 L 是因为它们像数字 1,去掉 O 是因为它像 0,去掉 U 则是为了降低意外拼出不雅英文单词的可能。

每个符号承载 5 位,因此 5 个字节变成 8 个字符,与 RFC 4648 Base32 相同。符号按 ASCII 升序排列,所以大小写一致、不带填充的字符串,其排序与所编码的数据一致。Crockford 规范不使用填充,因此请保持“填充”选项关闭。

容错解码

Crockford 规范要求解码器接受人们实际输入的各种写法,本工具也是这样处理的:

  • 大写和小写字母视为相同。
  • 字母 O 读作数字 0,字母 I 和 L 读作 1。
  • 为方便阅读长代码而插入的连字符会被忽略,空格和换行也一样。

字母 U 不是合法字符,出现时会连同位置一起报错。

字节、数字与 ULID

Crockford 的规范以数字为对象来描述编码,而本工具按 RFC 4648 的方式把字节序列切成 5 位一组,再用 Crockford 的符号表示。当总位数不是 5 的倍数时,基于数字的实现会把多出的零位补在前面,本工具则补在末尾,因此结果可能不同。

ULID 就是一个典型例子。它使用 Crockford 字母表,但把 128 位的值当作一个数字编码成 26 个字符,所以 ULID 的 16 个字节在这里编码出的字符串并不相同,而解码 ULID 得到的字节会错开两位。Crockford 规范中可选的校验符号(表示模 37 余数的额外字符)本工具不支持,既不会添加也不会验证。

编码规格

字母表0-9 A-Z,去掉 I L O U
输出体积每 5 字节输出 8 个字符(160%)
填充无
标准Crockford Base32(2002)
区分大小写否

编码示例

输入 (UTF-8)输出
Hello, World!91JPRV3F5GG5EVVJDHJ22
Base64.is89GQ6S9P6GQ6JWR
你好WJYT1SD5QM

常见问题

Crockford Base32 区分大小写吗?

不区分。输出默认是大写,勾选“小写”可以改为小写。解码器两种写法都接受,即使在同一个字符串中混用也没问题。

字母表里为什么没有 I、L、O、U?

I 和 L 容易被看成 1,O 容易被看成 0,所以它们被排除在外,解码时会被当作对应的数字。排除 U 是为了让随机生成的代码不容易拼出冒犯性的英文单词。

本工具支持 Crockford 校验符号吗?
不支持。规范允许在末尾附加一个表示模 37 校验值的字符,并为此额外使用 * ~ $ = U 这几个符号。本工具不会添加或验证校验符号,解码前请先将其删除。
可以在这里解码 ULID 吗?

无法得到准确的 16 个字节。ULID 把 128 位当作一个数字编码,多出的位补在前面,而本工具按字节分组,把多出的位补在末尾。读取 ULID 的时间戳和随机部分请使用专门的 ULID 库。