Base64 を Base58 に変換する方法
- 入力 · Base64 に Base64 文字列を貼り付けます。標準の文字でも URLセーフの文字でも使え、
=パディングの欠落、改行、data:接頭辞も問題ありません。 - 出力 · Base58 で結果を確認します。
- 変換先が Bitcoin 方式の Base58 でない場合は、出力の下の アルファベット を選びます。Flickr と Ripple は同じ 58 文字を異なる順序で並べています。
- 出力をコピー します。方向の切り替えで Base58 → Base64 をクリックすると逆方向に変換できます。Base58 を Base64 に変換 のページは最初からその方向で開きます。
変換は生のバイト列を経由します。Base64 をデコードし、そのバイト列を Base58 でエンコードします。何も追加・削除しないので、32 バイトの鍵は 32 バイトの鍵のままです。
例
| Base64 | Base58 | 内容 |
|---|---|---|
SGVsbG8= | 9Ajdvzr | テキスト Hello |
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= | 11111111111111111111111111111111 | 32 個のゼロバイト:Solana の System Program |
Bt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKk= | TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA | Solana の SPL Token プログラム ID |
Bt324ddloZPZy-FGzut5rBy0he1fWzeROoz1hX7_AKk | TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA | 同じ鍵をパディングなしの URLセーフ Base64 にしたもの |
最後の 2 行は同じ 32 バイトを 2 通りの Base64 で書いたものなので、どちらも同じ Base58 になります。
SHA-256 ダイジェストから IPFS の CIDv0 を作る
CIDv0 はマルチハッシュの Base58 です。マルチハッシュは、バイト 12(SHA-256)と 20(長さ 32 バイト)の後にダイジェストが続いたものです。多くのツールは SHA-256 ダイジェストを Base64 で表示しますが、それだけを変換しても Qm… の文字列にはなりません。
| バイト列 | Base64 | Base58 |
|---|---|---|
| ダイジェストのみ | JiqGtnblhp7dXRrfj/0B1inDFUv96uz8jPoNkOCILYo= | 3Zz6yE7jDUVDb6doCEWrK58or4X2TmTLBiJeyWY4NHvq |
12 20 + ダイジェスト | EiAmKoa2duWGnt1dGt+P/QHWKcMVS/3q7PyM+g2Q4Igtig== | QmQudp5N7EzTxrBk3yESEKyEroMYNd7R22G2KWffwNZyzq |
2 つ目の Base64 文字列の先頭にある EiA は 12 20 ヘッダーをエンコードしたものなので、Base64 のマルチハッシュは簡単に見分けられます。自分でヘッダーを付けるには、Base64 を Hex に変換 でダイジェストを変換し、前に 1220 を付けて、Base58 のページ で 変換元 を Hex(16進数) にしてエンコードしてください。
これが役立つのは、IPFS が計算したダイジェストがすでに手元にある場合だけです。IPFS が対象にするのは生のファイルではなく UnixFS ブロックなので、ファイルに sha256sum を実行しても CID は再現できません。
長さの比較:Base64 と Base58
| バイト数 | Base64 | Base58(ランダムなデータ) |
|---|---|---|
| 16 | 24 | 21 または 22 |
| 20 | 28 | 26~28 |
| 32 | 44 | 43 または 44 |
| 64 | 88 | 87 または 88 |
Base64 の長さはバイト数だけで決まりますが、Base58 の長さは値にも左右されます。Solana のアドレスが 32~44 文字の間でばらつくのはこのためです。Base58 を厳密な長さで検証しないでください。
JavaScript での同じ変換
Node.js は Base64 をネイティブにデコードできます。Base58 の部分には BigInt が必要です。
const ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
function base64ToBase58(b64) {
const bytes = Buffer.from(b64, "base64");
let n = BigInt("0x" + (bytes.toString("hex") || "0"));
let out = "";
while (n > 0n) {
out = ALPHABET[Number(n % 58n)] + out;
n /= 58n;
}
for (const b of bytes) {
if (b !== 0) break;
out = "1" + out;
}
return out;
}
base64ToBase58("Bt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKk=");
// 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'
Buffer.from(…, "base64") は URLセーフな入力も受け付けます。この関数は Node の Buffer に依存しています。詳しくは Node.js での Base64 で解説しています。
よくある質問
バイト列にデコードせずに Base64 を Base58 に変換できますか?
1 文字ずつの変換はできません。Base64 は 6 ビット単位の固定グループを対応させますが、Base58 はバイト列全体を 1 つの数として扱います。そのため、このページも含めてどの変換ツールも、まず Base64 をバイト列にデコードし、そのバイト列を再エンコードします。
Base58 の結果が Base64 より短くなることがあるのはなぜですか?
Base58 にはパディングがなく、先頭のゼロバイトはそれぞれ 1 文字になるからです。32 バイトは Base64 では常に 44 文字(= 込み)ですが、Base58 では 43 文字か 44 文字で、すべてのバイトがゼロのときだけ 32 文字になります。
Solana はどの Base58 アルファベットを使っていますか?
Bitcoin のアルファベットで、ここでもデフォルトです。Flickr や Ripple のものが必要な場合は アルファベット から選べます。
Base58 の出力が Qm で始まらないのはなぜですか?
Qm は 2 バイトのマルチハッシュヘッダー 12 20 から生まれます。Base64 に 32 バイトの SHA-256 ダイジェストしか入っていない場合は、このページで説明しているように、先にその 2 バイトを前に付けてください。