使い方
- テキストを Base45 にするには「エンコード」を、Base45 をテキストやバイト列に戻すには「デコード」を選択します。
- テキストを入力または貼り付けるか、ファイルを開きます。スペースはアルファベットの一部なので、削除しないでください。
- 証明書のペイロードのようなバイナリデータをデコードする場合は、「出力形式」を「16進数」に切り替えます。
- 結果をコピーするか、ファイルとしてダウンロードします。
Base45 とは
Base45 は RFC 9285 で定義されています。アルファベットは、数字 0-9、大文字 A-Z、そしてスペースと $ % * + - . / : の 9 つの記号です。これは、QR コードがコンパクトな英数字モードで格納できる 45 文字とまったく同じです。スペースは区切り文字ではなく、アルファベットの正式な 1 文字である点に注意してください。
エンコーダーは入力を 2 バイトずつ読み取り、0~65535 の数値として扱い、その数値を下位の桁から順に 3 桁の Base45 で書き出します。最後に 1 バイトだけ残った場合は 2 文字になります。テキストとしては、結果は入力の 1.5 倍のサイズになり、Base64 より大きくなります。
Base45 が QR コードに適している理由
英数字モードの QR コードは、2 文字を 11 ビットに詰め込みます。Base64 は小文字を必要とするためこのモードを使えず、1 文字 8 ビットのバイトモードになり、データ 1 バイトあたり約 10.7 ビットを使います。Base45 なら英数字モードで 1 バイトあたり 8.25 ビットで済むため、同じデータをより小さく読み取りやすい QR コードに収められます。
デコード時は、スペースをそのまま残してください。無視されるのは改行だけです。小文字はアルファベットに含まれないため、無効な文字として表示されます。
EU デジタル COVID 証明書のデコード
EU デジタル COVID 証明書の QR コードには、HC1: で始まるテキストが含まれています。残りの部分は Base45 で、証明書のデータは CBOR でエンコードされ、COSE で署名され、zlib で圧縮されたうえで Base45 でエンコードされています。中身を確認するには、次の手順に従います。
HC1:のプレフィックスを取り除きます。この 4 文字は有効な Base45 の文字なので、残したままだと誤ったバイト列になります。- 残りの部分を、出力を16進数にしてここでデコードします。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 文字の 1 つで、データを表しています。Base45 のテキストのスペースを削除したりまとめたりしないでください。デコードに失敗するか、誤ったバイト列になります。
HC1: で始まる文字列をデコードするにはどうすればよいですか?
HC1: のプレフィックスを取り除き、残りを出力を16進数にしてデコードします。次に、その結果を zlib で展開し、別のツールで CBOR データを読み取ります。このツールが行うのは Base45 の手順だけです。
Base45 は大文字と小文字を区別しますか?
はい。QR コードの英数字モードには小文字がないため、アルファベットに含まれるのは大文字だけです。小文字を入力すると、その位置とともに無効な文字として表示されます。
Base45 は Base64 よりコンパクトですか?
プレーンテキストとしては違います。Base45 は入力の 1.5 倍、Base64 は約 1.33 倍のサイズです。QR コードの中では、Base45 のほうがコンパクトです。より高密度な英数字モードを使えるためです。