Base64 文字列を修復する方法
- 壊れた値を チェックする Base64 に貼り付けます。前後の引用符、プレフィックス、改行は残したままにしてください。何が起きたのかを判断する手がかりになります。
- 出力形式 を選びます。標準(パディングあり)、標準(パディングなし)、URLセーフ(パディングあり・なし)、MIME(76 文字の行、CRLF)、PEM(64 文字の行)から選べます。
- 修正内容 を確認します。修復は一つずつ個別に表示されるので、無害な整形とデータが失われたかもしれない変更とを見分けられます。
- 結果をコピーまたはダウンロードするか、結果を検証 を押して完全なチェックを実行するか、デコードしたファイルをダウンロード でバイト列を保存します。
修復できる内容
| 貼り付けた値 | 何が起きたか | 修復後 |
|---|---|---|
"SGVsbG8gd29ybGQ\u003d" | = がエスケープされた JSON 文字列 | SGVsbG8gd29ybGQ= |
SGVsbG8%3D | URL 内でパーセントエンコードされた | SGVsbG8= |
PDw/Pz8 Pg== | クエリ文字列で + が空白になった | PDw/Pz8+Pg== |
PDw_Pz8-Pg | URLセーフでパディングなし | PDw/Pz8+Pg== |
SGVsbG8gd29ybGQ | パディングが削られた | SGVsbG8gd29ybGQ= |
SGVsbG8=V29ybGQ= | 2 つの値が連結された | SGVsbG9Xb3JsZA==(HelloWorld) |
SGVsbG9= | 未使用ビットが 0 でない | SGVsbG8= |
Authorization: Basic … | ヘッダー名ごとコピーされた | トークンのみ |
このほか、data:…;base64, プレフィックスや PEM の -----BEGIN …----- 行の削除、普通の引用符の除去、文字どおりの \n や \/ の復元(PHP の json_encode はデフォルトで \/ と書きます)、空白と改行の除去、+/ と -_ が混在したアルファベットの統一、= の個数の修正も行います。
連結された値は、各断片を個別にデコードしてからバイト列をつなげます。プログラムがパディング付きの断片を次々に追記した場合は、これが正しい処理です。代わりに途中の = を削除すると、それ以降のビットがすべてずれて、意味のないデータになります。
本当の問題を隠しかねない修復
次の 2 つは推測に基づく修復なので、警告として表示されます。
- 不正な文字を削除した場合。 文字列に
*、#、紛れ込んだ Unicode 文字などがあると、ツールはそれを削除し、どの文字を消したかを表示します。データの途中にある文字は、本来の記号が化けたものかもしれません。その場合、デコードしたバイト列はその位置から先がやはり正しくありません。 - はみ出した 1 文字を削除した場合。 4 で割った余りが 1 になる長さは、どのエンコーダーも生成しません。つまり 1 文字余分か、文字列が途中で切れています。ツールは残りをデコードできるよう最後の 1 文字を削除しますが、値が切り詰められていたのなら、ファイルの末尾は失われています。切れた画像はたいてい下部が灰色になるか欠け、切れた ZIP は開けません。
どちらかの警告が出たら、元データをもう一度入手してください。切り詰められていないログ行、API レスポンス全体、メールサーバーから直接取得した添付ファイルなどです。
単純な修正では足りない理由
Base64 を「直す」定番のコードは、空白、URLセーフ文字、パディングを処理します。
def fix_base64(s):
s = "".join(s.split())
s = s.replace("-", "+").replace("_", "/").rstrip("=")
return s + "=" * (-len(s) % 4)
これで SGVsbG8gd29ybGQ と PDw_Pz8-Pg は正しく直ります。ところが + が空白になった PDw/Pz8 Pg== を渡すと、空白が削除されてデータ文字が 9 個になり、Python は「number of data characters (9) cannot be 1 more than a multiple of 4」で失敗します。JSON エスケープ、%3D、くっついた断片、プレフィックスも同じようにすり抜けます。このツールは修正を一つずつ試し、空白を + に戻す変更は結果の長さが正しくなる場合にだけ適用します。
長期的に安全な対策は、発生元で直すことです。URL に入れる前に Base64 をパーセントエンコードするか Base64URL を使い、テキストを折り返したりエスケープしたりする場所には置かないようにしてください。修復した文字列をデコードしても予想外の結果になる場合は、Base64 エラーガイド で文字化けや二重エンコードを解説しています。バイト列は Base64 デコーダー で確認できます。
よくある質問
Python の「Incorrect padding」エラーを直すには?
長さが 4 の倍数になるまで = を足します:s + "=" * (-len(s) % 4)。それでもエラーが出る場合は、空白やエスケープなど別の破損があります。ここに貼り付ければ、ほかに何が問題なのかがわかります。
Base64 に空白が混じっているのはなぜですか?
たいていは、+ がパーセントエンコードされないまま URL のクエリ文字列や HTML フォームを通り、受け取った側で空白に変換されたためです。修復ツールは、長さが正しくなる場合に限って + に戻します。
修復でデータが失われることはありますか?
不正な文字や、はみ出した最後の 1 文字を削除した場合はありえます。その場合は修正一覧にそう表示されます。データが途中で切れていたために 1 文字削除したと表示されたら、結果を信用せず、元データの完全なコピーを入手してください。
Base64 の末尾にある \u003d は何ですか?
= の JSON エスケープです。Gson など一部の JSON ライブラリは、HTML 上の安全のために = をエスケープします。JSON パーサーなら自動で元に戻しますし、生のテキストを貼り付ければこの修復ツールも同じように戻します。