web-dev-qa-db-ja.com

base64でエンコードされた文字列の最後に=記号があるのはなぜですか

私はbase64エンコーディングとC#でのbase64エンコーディングの計算方法を知っていますが、文字列をbase64に変換すると最後に=があることを何度か見てきました。

いくつか質問がありました。

  1. base64文字列は常に=で終わりますか?
  2. なぜ最後に=が追加されるのですか?
264
santosh singh

padding として機能します。

より完全な答えは、base64でエンコードされた文字列は=で終わらないalwaysではなく、必要な場合は1つまたは2つの=で終わるだけです文字列を適切な長さまでパディングします。

242
Andrew Hare

1 - いいえ

2 - 簡単な答えとして:65番目の文字( "="記号)は、メッセージをエンコードする最後のプロセスの補完としてのみ使用されます。

Base64エンコーディングはそれぞれthree bytes(8bits)を取り、それらをfour printableとして表現するため、文字列の長さが3文字の倍数の場合、 '='記号は表示されません。 ASCII標準の文字.

詳細:

(a)エンコードしたい場合

ABCDEFG <=> [ABCname__] [DEFname__] [Gname__]

Base64は最初のブロックと2番目のブロック(完成したとおり)を処理します(4文字を生成します)が、3番目のブロックでは必要な4文字を完了するために出力に二重==が追加されます。したがって、結果はQUJDREVGRw ==(スペースなし)になります。

(b)エンコードしたい場合は...

ABCDEFGH <=> [ABCname__] [DEFname__] [GHname__]

同様に、出力の最後に=を1文字追加するだけで4文字になります。QUJDREVGR0g =(スペースなし)

195
Badr Bellaj

から Wikipedia

最後の '=='シーケンスは、最後のグループに1バイトしか含まれていないことを示し、 '='には2バイトが含まれていることを示します。

したがって、これはある種のパディングです。

63
Legolas
  1. いいえ.
  2. Base64でエンコードされた文字列を4文字の倍数の長さにパディングして、正しくデコードできるようにします。
15
Ian Kemp

エンコードされたデータの末尾で24ビット未満しか使用できない場合は、 RFC 2045 で特別なパディング文字として定義されています。

14
iandotkelly

等号(=)は、特定の形式のbase64エンコードでは埋め込みとして使用されます。 base64の Wikipediaの記事 にすべての詳細があります。

11
Sam Holloway

それはパディングです。 http://en.wikipedia.org/wiki/Base64から

理論的には、欠けているバイト数はBase64桁の数から計算できるため、パディング文字はデコードには必要ありません。一部の実装では、パディング文字は必須ですが、それ以外の場合は使用されません。埋め込み文字が必要な場合の1つのケースは、複数のBase64エンコードファイルを連結することです。

8
Thomas Leonard

http://www.hcidata.info/base64.htm

「Mary has」をBase 64にエンコードする

この例では、単純なテキスト文字列( "Mary had")を使用していますが、データがどのようなものであっても原則は変わりません(例:グラフィックファイル)。各24ビットの入力データを32ビットの出力に変換するために、Base 64エンコードでは24ビットを6ビットの4つのチャンクに分割します。私たちが気づく最初の問題は、「Maryが持っていた」が3バイトの倍数ではないということです - それは8バイト長です。このため、最後のビットグループはわずか4ビットです。これを解決するために、我々は2つの余分なビット「0」を追加して、最後に「=」を置くことによってこの事実を覚えています。 Base 64に変換されるテキスト文字列の長さが7バイトの場合、最後のグループは2ビットになります。この場合、4つの余分な '0'ビットを追加し、最後に '=='を置くことでこの事実を覚えているでしょう。

7
Dev