Base64 を XML にデコードする手順
- Base64 を 入力 · Base64 に貼り付けます。ページを開くと小さなサンプルが読み込まれています。
- XML が 出力 · テキスト に表示されます。ステータス行の 推定形式 に XML と出ていれば、内容が XML 文書のように始まっていることを示します。
- 出力の文字の間に隙間があったり、バイナリの警告が出たりする場合、その XML は UTF-16 です。文字コード を UTF-16LE に、先頭にバイト順マークがあるなら 自動検出 に設定してください。
- 出力をコピー でテキストをコピーします。ダウンロード で元のバイト列を
decoded.xmlとして保存します。
サンプルの PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxub3RlPjx0bz55b3U8L3RvPjxib2R5PkhlbGxvPC9ib2R5Pjwvbm90ZT4= は次のようにデコードされます。
<?xml version="1.0"?>
<note><to>you</to><body>Hello</body></note>
逆方向は XML から Base64 へ です。
エンコードされた XML の見分け方
XML は < で始まるので、その Base64 は P で始まり、続く文字からさらに多くのことがわかります。
| Base64 の先頭 | デコード後の先頭 | 典型的な文書 |
|---|---|---|
PD94bWwg | <?xml | 宣言のあるあらゆる XML ファイル |
PHNhbWxwOlJlc3BvbnNl | <samlp:Response | SAML のログインレスポンス(SAML デコーダー) |
PHNvYXA6RW52ZWxvcGU | <soap:Envelope | SOAP メッセージ |
PEludm9pY2U | <Invoice | UBL の電子請求書 |
//48AD8AeABtAGwA | BOM + UTF-16LE の <?xml | UTF-16 で保存された XML |
SAML のはずなのに P で始まらない値は、たいてい圧縮された XML です。展開する方法は後で説明します。
UTF-16 とその他のエンコーディング
XML の大半は UTF-8 で、デコーダーもそれを前提にしています。別の 文字コード が必要になるのは次の 2 つのケースです。
- UTF-16 の文書 は Windows のツールや .NET でよく作られ、ASCII 文字の隣にゼロバイトが並びます。UTF-8 としてデコードするとバイナリデータのように見え、ツールもそう表示します。自動検出 か UTF-16LE を選ぶと、
<?xml version="1.0" encoding="UTF-16"?>で始まる全文が表示されます。ダウンロード はバイト列をそのまま保存しますが、ファイル名がdecoded.binになるので、.xmlに名前を変えてください。 - Latin-1 や Windows-1252 の文書 は、
encoding="ISO-8859-1"などと宣言しています。UTF-8 モードではアクセント付きの文字が�になるので、宣言されている文字コードを選んで読んでください。
出力内の XML 宣言を見れば、作成者が意図した文字コードがわかります。ダウンロードしたファイルを読む XML パーサーはこの宣言に従うので、画面上のプレビューで文字コードを手動で選ぶ必要があったとしても、ファイル自体は問題ありません。
Base64 の XML が使われる場面
最も多いのは SAML です。ID プロバイダーは SAMLResponse を Base64 エンコードした XML としてアプリケーションに POST します。ログインのデバッグでは、ブラウザのネットワークタブからこれをコピーするのが一般的です。SOAP サービスや電子請求書のプラットフォームは、文書や添付ファイルを Base64 のフィールドで返します。メールは XML の添付ファイルを MIME の Base64 パートとして運ぶことができ、メールデコーダー でそれを取り出せます。
リダイレクト URL に含まれる SAML の SAMLRequest の値は、エンコード前に XML が raw DEFLATE で圧縮されているため、Base64 をデコードしただけではバイナリになります。gzip Base64 デコーダー で展開できます。%2B、%2F、%3D のエスケープは自動的にデコードされます。値全体が URL エンコードされている場合は、先に URL デコーダー を使ってください。
コードで Base64 を XML にする
デコードしたバイト列は、文字列に変換せずにそのまま XML パーサーに渡してください。そうすればパーサーが宣言からエンコーディングを読み取ります。
import base64
import xml.etree.ElementTree as ET
s = "PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxub3RlPjx0bz55b3U8L3RvPjxib2R5PkhlbGxvPC9ib2R5Pjwvbm90ZT4="
root = ET.fromstring(base64.b64decode(s))
root.find("body").text # 'Hello'
// Browser
const s = "PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxub3RlPjx0bz55b3U8L3RvPjxib2R5PkhlbGxvPC9ib2R5Pjwvbm90ZT4=";
const bytes = Uint8Array.from(atob(s), c => c.charCodeAt(0));
const doc = new DOMParser().parseFromString(new TextDecoder().decode(bytes), "application/xml");
ブラウザで UTF-16 や Latin-1 の XML を扱うときは、TextDecoder に正しいラベルを渡してください。詳しくは Python での Base64 と JavaScript での Base64 をご覧ください。
よくある質問
Base64 を XML ファイルにデコードするには?
上の入力欄に Base64 を貼り付けます。ステータス行に XML と表示されたら、ダウンロード でデコードしたバイト列を decoded.xml として保存できます。元のエンコーディングも署名も、1 バイトも変えずにそのまま残ります。
Base64 の中身が XML かどうかはどう見分けますか?
XML 宣言のある文書は PD94bWwg(<?xml )で始まります。宣言がなくても、文書は必ず < で始まるので文字列は P で始まります。PHNhbWxwOlJlc3BvbnNl は <samlp:Response です。
XML を整形やインデントできますか?
できません。XML はデコードしたとおりに表示し、「JSON を整形」オプションは JSON にしか効きません。署名付き XML では整形するだけで内容が変わってしまうため、元のバイト列を表示することに意味があります。
デコードした SAML リクエストがランダムなバイト列に見えるのはなぜですか?
リダイレクト URL で送られる SAML リクエストは、Base64 エンコードの前に raw DEFLATE で圧縮されています。gzip Base64 デコーダー で展開するか、SAML デコーダー で開いてください。