Base64 をバイト配列に変換する方法
- 入力欄に Base64 を貼り付けます。空白、パディングの欠落、URLセーフの文字、
data:接頭辞も受け付けます。 - 出力の下の 言語 で出力先を選びます。C / C++、JavaScript、Python、Java、Go、C#、Rust があり、ページを開いた時点では JavaScript が選ばれています。
- 出力をコピー して、宣言をコードに貼り付けます。
dataの名前は適宜変更してください。 - ツール上部の 変換元 と 変換先 のメニューで、入力や出力の形式を切り替えられます。たとえば Base64 の代わりに 16進数を読み込むこともできます。
配列から Base64 に戻すには、これらの形式をすべて読み込める バイト配列を Base64 に変換 を使ってください。
言語ごとの出力
Base64 の 3q2+7wABAgOAf/8K をデコードすると、de ad be ef 00 01 02 03 80 7f ff 0a の 12 バイトになります。言語 の設定ごとの出力は次のとおりです。
const unsigned char data[12] = {
0xde, 0xad, 0xbe, 0xef, 0x00, 0x01, 0x02, 0x03, 0x80, 0x7f, 0xff, 0x0a
};
const data = new Uint8Array([
0xde, 0xad, 0xbe, 0xef, 0x00, 0x01, 0x02, 0x03, 0x80, 0x7f, 0xff, 0x0a
]);
data = b'\xde\xad\xbe\xef\x00\x01\x02\x03\x80\x7f\xff\x0a'
byte[] data = new byte[] {
-34, -83, -66, -17, 0, 1, 2, 3, -128, 127, -1, 10
};
data := []byte{
0xde, 0xad, 0xbe, 0xef, 0x00, 0x01, 0x02, 0x03, 0x80, 0x7f, 0xff, 0x0a,
}
byte[] data = new byte[] {
0xde, 0xad, 0xbe, 0xef, 0x00, 0x01, 0x02, 0x03, 0x80, 0x7f, 0xff, 0x0a
};
let data: [u8; 12] = [
0xde, 0xad, 0xbe, 0xef, 0x00, 0x01, 0x02, 0x03, 0x80, 0x7f, 0xff, 0x0a
];
出力についての補足です。
- 配列は 1 行 12 個の値で折り返します。Python は
b'...'文字列 1 つにつき 16 バイトを書き、それより長いデータは括弧の中で連結します。Python はコンパイル時にこれを結合します。 - Java が符号付きの 10進数を使うのは、
0x7fを超える値すべてに(byte) 0xdeのようなキャストが必要になるからです。-34と0xdeはビットとしては同じです。 - C と Rust は長さを宣言します。C の配列は
unsigned charなので、127 を超える値も警告なしで収まります。 - Go では最後の値の後にもカンマが付きます。閉じ括弧が独立した行にある場合、コンパイラがこれを要求するためです。
- Python は表示可能な文字も含めてすべてのバイトを
\x..で書くので、リテラルが読みやすく、差分も取りやすくなります。
バイト列を埋め込むか、Base64 のまま保つか
バイト配列リテラルが適しているのは、プログラムに Base64 デコーダーがない場合や、デコードに時間を使うべきでない場合です。マイコンのファームウェア、テストフィクスチャ、バイナリに組み込む小さな鍵や証明書、ルックアップテーブルなどがこれにあたります。代償はソースファイルのサイズです。1 バイトあたり約 6 文字(0xde, )と Base64 の 4 倍以上になるので、10 KB のデータはおよそ 60 KB のコードになります。
変更されるものや数 KB を超えるものは、Base64 文字列のまま保持し、起動時にデコードしてください。
import base64
data = base64.b64decode("3q2+7wABAgOAf/8K")
byte[] data = Convert.FromBase64String("3q2+7wABAgOAf/8K");
byte[] data = java.util.Base64.getDecoder().decode("3q2+7wABAgOAf/8K");
const data = Uint8Array.from(atob("3q2+7wABAgOAf/8K"), c => c.charCodeAt(0));
新しいブラウザには Uint8Array.fromBase64() もあります。Uint8Array.fromBase64 と toBase64 で解説しています。C#、Java、Go、Rust、Python の各言語のページでは、デコーダーをさらに詳しく紹介しています。
よくある問題
- 「無効な Base64」。 文字列にアルファベット外の文字が含まれているか、途中で切れています。メッセージには位置が示されます。壊れた文字列のどこが悪いのかは Base64 バリデーター で確認できます。
- C++ での「narrowing conversion」エラー。
char data[] = {0xde};は C++11 以降ではコンパイルできません。多くのプラットフォームで素のcharは符号付きで、222 が収まらないからです。生成されたunsigned charのまま使うか、uint8_tを使ってください。 - 出力が巨大になる。 大きなファイルなら
xxd -i file.binで C の配列を直接出力でき、C23 の#embedのような埋め込み機能を使えば配列自体が不要になります。
よくある質問
C# で Base64 文字列をバイト配列に変換するには?
実行時なら byte[] data = Convert.FromBase64String(s); です。バイト列をハードコードしたい場合は、ここで 言語 を C# にして、new byte[] { ... } の宣言をソースに貼り付けてください。
Java の配列に負の数が含まれるのはなぜですか?
Java の byte は符号付きで、−128~127 の値を持つからです。0x80~0xff のバイトは −128~−1 と書かれるので、0xde は -34 になります。ビットは同じで、b & 0xff で符号なしの値に戻せます。
Python で Base64 をバイト列にするには?
base64.b64decode(s) が bytes オブジェクトを返します。その値を b'\x..' リテラルとして書き出したい場合は、ここで 言語 を Python にしてください。
JavaScript の出力は Uint8Array ですか?
はい。16進数の値を使った const data = new Uint8Array([...]) です。ブラウザでも Node.js でも動きます。Node で API が Buffer を必要とする場合は、Buffer.from(data) で包んでください。