19.6. base64 — Base16, Base32, Base64, Base85 データの符号化

このモジュールはバイナリデータを印字可能な ASCII にエンコード関数、およびそのようなエンコードデータをバイナリにデコードする関数を提供します。それらは、RFC 3548 が定義する Base16, Base32, Base64 のエンコーディング、デファクトスタンダードになっている Ascii85, Base85 のエンコーディングについてのエンコード、デコード関数です。

RFC 3548 エンコーディングは、email で安全に送信したり、 URL の一部として使ったり、あるいは HTTP POST リクエストの一部に含めるために用いるのに適しています。このエンコーディングで使われているアルゴリズムは uuencode プログラムで用いられているものとは同じではありません。

このモジュールでは 2つの RFC 3548 インターフェイスが提供されています。現代的なインターフェイスは、 RFC 3548 が定義する 3 種類のアルファベット集合(ノーマル, URL セーフ, ファイルシステムセーフ)を使った ASCII バイト列オブジェクトのエンコードおよびデコードをすべてサポートします。加えて、現代的なインターフェイスのデコード関数は ASCII 文字だけで構成された Unicode 文字列も受け付けます。一方、レガシーなインターフェイスは、バイト列とともにファイル風のオブジェクトに対するエンコード / デコードを提供しますが、Base64 標準のアルファベット集合しか使いません。

バージョン 3.3 で変更: モダンなインターフェイスのデコード関数が ASCII のみの Unicode 文字列を受け付けるようになりました。

バージョン 3.4 で変更: このモジュールの全てのエンコード・デコード関数が bytes-like objects を受け容れるようになりました。Ascii85/Base85 のサポートが追加されました。

モダンなインターフェイスは以下のものを提供します:

base64.b64encode(s, altchars=None)

base64 をつかって、byte 文字列をエンコードします。

s はエンコードする文字列です。オプション引数 altchars は最低でも 2 の長さをもつ文字列で (これ以降の文字は無視されます)、これは +/ の代わりに使われる代替アルファベットを指定します。これにより、アプリケーションはたとえば URL やファイルシステムの影響をうけない Base64 文字列を生成することができます。デフォルトの値は None で、これは標準の Base64 アルファベット集合が使われることを意味します。

エンコードされたバイト文字列が返されます。

base64.b64decode(s, altchars=None, validate=False)

Base64 エンコードされたバイト文字列をデコードします。

s にはデコードするバイト文字列を渡します。オプション引数の altchars は最低でも 2 の長さをもつ文字列で (これ以降の文字は無視されます)、これは +/ の代わりに使われる代替アルファベットを指定します。

デコードされた文字列が返されます。 s が正しくパディングされていない場合は binascii.Error 例外を発生させます。

validateFalse (デフォルト) の場合、 base64 アルファベット以外の文字はパディングチェックの前に無視されます。 validateTrue の場合、入力に base64 アルファベット以外の文字があると binascii.Error を発生させます。

base64.standard_b64encode(s)

標準の base64 アルファベットを利用してバイト文字列 s をエンコードします。

base64.standard_b64decode(s)

標準の base64 アルファベットを利用してバイト文字列 s をデコードします。

base64.urlsafe_b64encode(s)

バイト文字列 s を URL-safe アルファベットを利用してエンコードします。標準 base64 アルファベットに比べて、+ の替わりに - を、/ の替わりに _ を利用します。結果は = を含みます。

base64.urlsafe_b64decode(s)

バイト文字列 s を URL-safe アルファベットを利用してデコードします。標準 base64 アルファベットに比べて、+ の替わりに - を、/ の替わりに _ を置換します。

base64.b32encode(s)

バイト文字列を base32 を使ってエンコードします。s はエンコードする文字列です。エンコードした文字列を返します。

base64.b32decode(s, casefold=False, map01=None)

Base32 エンコードされたバイト文字列をデコードします。

s にはエンコードするバイト文字列を渡します。オプション引数 casefold は小文字のアルファベットを受けつけるかどうかを指定します。セキュリティ上の理由により、デフォルトではこれは False になっています。

RFC 3548 は付加的なマッピングとして、数字の 0 (零) をアルファベットの O (オー) に、数字の 1 (壱) をアルファベットの I (アイ) または L (エル) に対応させることを許しています。オプション引数は map01 は、 None でないときは、数字の 1 をどの文字に対応づけるかを指定します (map01None でないとき、数字の 0 はつねにアルファベットの O (オー) に対応づけられます)。セキュリティ上の理由により、これはデフォルトでは None になっているため、 0 および 1 は入力として許可されていません。

デコードしたバイト文字列を返します。 s が正しくパディングされていない場合や、文字列にアルファベットでない文字が含まれていた場合に、 binascii.Error 例外を発生させます。

base64.b16encode(s)

Base16 をつかって、文字列をエンコードします。

s はエンコードする文字列です。エンコードしたバイト文字列を返します。

base64.b16decode(s, casefold=False)

Base16 エンコードされたバイト文字列をデコードします。

s にはエンコードする文字列を渡します。オプション引数 casefold は小文字のアルファベットを受けつけるかどうかを指定します。セキュリティ上の理由により、デフォルトではこれは False になっています。

デコードされたバイト列が返されます。 s が正しくパディングされていなかったり、規定のアルファベット以外の文字が含まれていた場合には TypeError が発生します。

base64.a85encode(s, *, foldspaces=False, wrapcol=0, pad=False, adobe=False)

Ascii85 を使って、バイト文字列をエンコードします。

s はエンコードする文字列です。エンコードしたバイト文字列を返します。

foldspaces を使うと、4 つの連続した空白文字(ASCII 0x20)を ‘btoa’ によってサポートされている短い特殊文字 ‘y’ に置き換えます。この機能は “標準” Ascii85 ではサポートされていません。

wrapcol は何文字ごとに改行文字('\n')を挿入するかを制御します。ゼロでない場合、出力の各行はこの与えられた文字数を超えません。

pad を指定すると、エンコード前に入力文字列が 4 の倍数になるようにパディングされます。なお、 btoa の実装は常にパディングします。

adobe を指定すると、エンコードしたバイトシーケンスを <~~> で囲みます。これは Adobe の実装で使われています。

バージョン 3.4 で追加.

base64.a85decode(s, *, foldspaces=False, adobe=False, ignorechars=b' tnrv')

Ascii85 エンコードされたバイト文字列をデコードします。

s はデコードするバイト文字列です。

foldspaces は、短い特殊文字 ‘y’ を受け取って 4 つの連続した空白文字(ASCII 0x20)と解釈するかどうかを制御します。この機能は “標準” Ascii85 ではサポートされていません。

adobe で、入力シーケンスが Adobe Ascii85 (つまり <~~> で囲まれている)かどうかを伝えます。

ignorechars には、入力に含まれていれば無視する文字で構成されたバイト列を指定してください。これは空白文字だけで構成されているべきです。デフォルトは ASCII における空白文字全てです。

バージョン 3.4 で追加.

base64.b85encode(s, pad=False)

base85 を使ってバイト列をエンコードします。これは例えば git スタイルのバイナリ diff で用いられています。

pad が真ならば、エンコードに先立って、バイト数が 4 の倍数となるように入力が “\0” でパディングされます。

バージョン 3.4 で追加.

base64.b85decode(b)

base85でエンコードされたバイト列をデコードします。パディングは、もしあれば、暗黙に削除されます。

バージョン 3.4 で追加.

注釈

よく知られた Base64 エンコードによる膨張率は 6/4 ですが、Base85, Ascii85 エンコードによる膨張率は 5/4 です(Base85/Ascii85 文字 5 つで 4 バイトのバイナリをエンコード出来ます)。つまりそれらは空間効率においてより効果的です。これらはエンコードのための文字マッピングのような詳細において違っているのです。

レガシーなインターフェイスは以下のものを提供します:

base64.decode(input, output)

input ファイルの中身をデコードし、結果のバイナリデータを output ファイルに出力します。 inputoutput ともに file objects でなければなりません。 inputinput.read() が空バイト列を返すまで読まれます。

base64.decodebytes(s)
base64.decodestring(s)

バイト列 s をデコードし、結果のバイナリデータを持つバイト列を返します。 s には一行以上の base64 形式でエンコードされたデータが含まれている必要があります。 decodestring は廃止されたエイリアスです。

バージョン 3.1 で追加.

base64.encode(input, output)

バイナリの input ファイルの中身を base64 形式でエンコードした結果を output ファイルに出力します。 inputoutput ともに file objects でなければなりません。 inputinput.read() が空バイト列を返すまで読まれます。 encode() はエンコードされたデータと改行文字(b'\n')を出力します。

base64.encodebytes(s)
base64.encodestring(s)

任意のバイナリデータを含むバイト列 s をエンコードし、一行以上からなる base64 形式のバイト列を返します。 encodebytes() は base64 形式の一行以上のデータを返しますが、これには常に改行文字 (b'\n')を含みます。 encodestring は廃止されたエイリアスです。

モジュールの使用例:

>>> import base64
>>> encoded = base64.b64encode(b'data to be encoded')
>>> encoded
b'ZGF0YSB0byBiZSBlbmNvZGVk'
>>> data = base64.b64decode(encoded)
>>> data
b'data to be encoded'

参考

binascii モジュール

ASCII からバイナリへ、バイナリからASCIIへの変換をサポートするモジュール。

RFC 1521 - MIME (Multipurpose Internet Mail Extensions) Part One: Mechanisms for Specifying and Describing the Format of Internet Message Bodies
Section 5.2, “Base64 Content-Transfer-Encoding,” provides the definition of the base64 encoding.