Base64 で文字列をエンコードするにはなぜ「b」が必要なのでしょうか? 質問する

Base64 で文字列をエンコードするにはなぜ「b」が必要なのでしょうか? 質問する

私はドキュメントからの例Python で Base64 エンコーディングを使用する方法:

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

しかし、先頭を省略して通常の文字列をエンコードしようとするとb

>>> encoded = base64.b64encode('data to be encoded')

が表示されますTypeError。Python の古いバージョンでは次のようになっていました。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python32\lib\base64.py", line 56, in b64encode
    raise TypeError("expected bytes, not %s" % s.__class__.__name__)
TypeError: expected bytes, not str

最近のバージョンでは次のようになります。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.12/base64.py", line 58, in b64encode
    encoded = binascii.b2a_base64(s, newline=False)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: a bytes-like object is required, not 'str'

なぜこのようなことが起こるのでしょうか?

ベストアンサー1

A-Zbase64 エンコーディングは 8 ビットのバイナリ バイト データを受け取り、、、、 *の文字のみを使用してエンコードするため、電子メールなど、8 ビットのデータをa-zすべて保持しないチャネル経由で送信できます。0-9+/

したがって、8 ビット バイトの文字列が必要です。Python 3 では、構文を使用してこれを作成しますb''

を削除するとb、文字列になります。文字列は Unicode 文字のシーケンスです。base64 は Unicode データをどう処理すればよいかわかりません。Unicode データは 8 ビットではありません。実際、ビットはありません。:-)

2番目の例では:

>>> encoded = base64.b64encode('data to be encoded')

すべての文字はASCII文字セットにきちんと収まるため、base64エンコードは実際にはあまり意味がありません。代わりに、次のようにしてASCIIに変換することができます。

>>> encoded = 'data to be encoded'.encode('ascii')

あるいはもっと簡単に言うと:

>>> encoded = b'data to be encoded'

この場合も同じことになります。


* ほとんどのbase64の種類では、=末尾にパディングとして が含まれる場合があります。さらに、base64の種類によっては、 と 以外の文字が使用される場合があり+ます/バリアント概要表概要についてはWikipediaをご覧ください。

おすすめ記事