使用方法
- 选择“编码”把文本转换为 Base45,或选择“解码”把 Base45 还原为文本或字节。
- 输入或粘贴内容,也可以打开文件。请保留空格,它是字母表的一部分。
- 解码证书载荷等二进制数据时,把输出切换为“十六进制”。
- 复制结果,或将结果下载为文件。
什么是 Base45?
Base45 由 RFC 9285 定义。它的字母表包括数字 0-9、大写字母 A-Z 以及 9 个符号:空格和 $ % * + - . / :。这正是二维码在紧凑的字母数字模式下可以存储的 45 个字符。请注意,空格是字母表中的正式字符,而不是分隔符。
编码时每次取两个字节,把它们看作 0 到 65535 之间的数字,再写成三位 Base45 数字,低位在前。最后剩下的单个字节编码为两个字符。作为文本,结果是输入的 1.5 倍,比 Base64 更长。
为什么 Base45 适合二维码
在字母数字模式下,二维码用 11 位存储两个字符。Base64 需要小写字母,无法使用这种模式,只能退回每个字符 8 位的字节模式,平均每个数据字节约占 10.7 位。Base45 在字母数字模式下每个字节只需 8.25 位,同样的数据可以放进更小、更容易扫描的二维码。
解码时请原样保留空格,只有换行会被忽略。小写字母不属于字母表,会被报告为无效字符。
解码欧盟数字新冠证书
欧盟数字新冠证书(EU DCC)二维码中的文本以 HC1: 开头,后面是 Base45 数据:证书内容先编码为 CBOR,用 COSE 签名,再经 zlib 压缩,最后进行 Base45 编码。查看内容的步骤如下:
- 删除
HC1:前缀。这四个字符都是合法的 Base45 字符,不删除会得到错误的字节。 - 在这里解码剩余部分,输出选择“十六进制”。zlib 数据通常以字节
78开头。 - 用其他工具对字节进行 zlib 解压并解析 CBOR。
本工具只负责 Base45 这一步,不会解压、解析内容或验证签名。
在代码中使用 Base45
# Python (pip install base45)
import base45
base45.b45encode(b'AB') # RFC 9285 示例:BB8
base45.b45decode('BB8') # b'AB'
编码规格
| 字母表 | 0-9 A-Z 空格 $ % * + - . / : |
|---|---|
| 输出体积 | 每 2 字节输出 3 个字符(150%) |
| 填充 | 无 |
| 标准 | RFC 9285 |
| 区分大小写 | 是 |
编码示例
| 输入 (UTF-8) | 输出 |
|---|---|
Hello, World! | %69 VDK2E:3404ESVDX0 |
Base64.is | SH8LQEG%61*5P2 |
你好 | C-SEFK*.K |
常见问题
为什么 Base45 输出里有空格?
空格是 45 个字符之一,同样承载数据。请不要删除或合并 Base45 文本中的空格,否则解码会失败或得到错误的字节。
如何解码以 HC1: 开头的字符串?
先删除 HC1: 前缀,把剩余部分以“十六进制”输出解码,再用其他工具进行 zlib 解压并读取 CBOR 数据。本工具只完成 Base45 这一步。
Base45 区分大小写吗?
区分。字母表只包含大写字母,因为二维码的字母数字模式没有小写。输入小写字母会被报告为无效字符,并标出位置。
Base45 比 Base64 更紧凑吗?
作为纯文本并不是:Base45 是输入的 1.5 倍,Base64 约为 1.33 倍。但放进二维码时 Base45 更紧凑,因为它可以使用密度更高的字母数字模式。