Base45 编码解码

将文本、十六进制字节或文件转换为 Base45,也可以反向解码。Base45 只使用二维码字母数字模式支持的 45 个字符,能以很小的开销把二进制数据放进二维码。

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

使用方法

  1. 选择“编码”把文本转换为 Base45,或选择“解码”把 Base45 还原为文本或字节。
  2. 输入或粘贴内容,也可以打开文件。请保留空格,它是字母表的一部分。
  3. 解码证书载荷等二进制数据时,把输出切换为“十六进制”。
  4. 复制结果,或将结果下载为文件。

什么是 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 编码。查看内容的步骤如下:

  1. 删除 HC1: 前缀。这四个字符都是合法的 Base45 字符,不删除会得到错误的字节。
  2. 在这里解码剩余部分,输出选择“十六进制”。zlib 数据通常以字节 78 开头。
  3. 用其他工具对字节进行 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.isSH8LQEG%61*5P2
你好C-SEFK*.K

常见问题

为什么 Base45 输出里有空格?

空格是 45 个字符之一,同样承载数据。请不要删除或合并 Base45 文本中的空格,否则解码会失败或得到错误的字节。

如何解码以 HC1: 开头的字符串?

先删除 HC1: 前缀,把剩余部分以“十六进制”输出解码,再用其他工具进行 zlib 解压并读取 CBOR 数据。本工具只完成 Base45 这一步。

Base45 区分大小写吗?

区分。字母表只包含大写字母,因为二维码的字母数字模式没有小写。输入小写字母会被报告为无效字符,并标出位置。

Base45 比 Base64 更紧凑吗?

作为纯文本并不是:Base45 是输入的 1.5 倍,Base64 约为 1.33 倍。但放进二维码时 Base45 更紧凑,因为它可以使用密度更高的字母数字模式。