2010-12-01 7 views
5

可能性の重複:Wikipediaを引用
Why does base64 encoding requires padding if the input length is not divisible by 3?なぜBase64エンコーディングでパディングが使用されますか?

デコード時に...これらのパディング文字は、 を廃棄しなければならないが、それでも の計算が可能有効 符号化されていないテキストの長さ、その 入力バイナリの長さは、 の3バイトの倍数ではありません。 ...

しかし、長さの生データの計算は、パディング文字を取り除いても簡単に行うことができます。

  |    Encoded 
      |-------------------------------------- 
Raw Size | Total Size | Real Size | Padding Size 
1   | 4   | 2   | 2 
2   | 4   | 3   | 1 
3   | 4   | 4   | 0 
4   | 8   | 6   | 2 
5   | 8   | 7   | 1 
6   | 8   | 8   | 0 
7   | 12   | 10  | 2 
8   | 12   | 11  | 1 
9   | 12   | 12  | 0 
10  | 16   | 14  | 2 
. 
. 
. 

だから本当のエンコードされたサイズ(3列目)与えられたあなたは常に正しくサイズは次のようになり埋め何を推測することができます。

PaddedSize = 4 * Ceil (RealSize/4) 

だから、理論的には、パディングの必要はありませんでした。アルゴリズムはそれを処理していました。 Base64エンコーディングは一般的な業界標準であることを考慮すると、多くのアプリケーションやデバイスで使用されています。これらは、コード化されたサイズの縮小の恩恵を受けていました。ですから、なぜBase64エンコーディングでパディングが使われるのですか?

+0

@イグナシオ:その質問は非常に説明していない*理由は、しかし。 – BastiBen

+0

私はいくつかの重複が許可されていると思った(http://blog.stackoverflow。十分な情報が質問に入れられていて、別の見解で尋ねられていれば、com/2010/11/dr-strangedupe-or-how-i-learn-to-stop-worrying-and-love-duplication /) – Hemant

答えて

4

エンコードされたメッセージを4文字の整数倍にします。これにより、デコーダの作成がやや楽になるかもしれません。文字を4つのブロックでロードして処理し、3つの出力文字に変換することができます。パディングは、文字列の最後から外れることなく簡単に行うことができます。

+1

上記のように、実際のエンコードされたデータのサイズだけでパディング文字の数を計算できます。したがって、処理する前に追加することができます。実際にワイヤでそれらを送信する必要はありません! – Hemant

+3

ワイヤを介してそれらを送信するコストは非常に小さい(メッセージ当たり最大2バイト)。私はデザイナーが、(エンコードされたメッセージを、最後に可変長ブロックを持たずに、4バイトブロックのシーケンスにすることで)より簡単にする方が、より効率的にするよりも重要だと考えました。帯域幅が心配だったら、とにかにbase64を使用するシステムを設計しません。 – Angus

+0

ええと...シンプリシ部分に同意する傾向があります!そのちょうど私は、パディングの技術的な必要性があると仮定しました。 – Hemant

1

メッセージの長さに関係なく、エンドパッドは長さが最大2バイトなので、マイクロ最適化のほうがずっと重要です。アプリケーションがエンコーディングのプロデューサとコンシューマの両方である場合、パディングを取り除くことはできますが、面倒なことではありません。

+1

それがその目的ならば、それは確実に行うことができ、できないでしょう。 – Angus

+2

ええ、3分の1の場合、有効なbase64でエンコードされた文字列は、埋め込みで終了しません。 – Hemant

+0

@ Angus、Hemant:良い点、編集済み。 – Piskvor

0

Base64は古いもので、使用可能なRAMとCPUに制限があった日からのものです。 また、ソフトウェアを書くこともより複雑でした(今日のSDKとツールキットはです。は80年代や90年代に比べて使いやすくなりました)、Base64はさまざまなシステムアーキテクチャで動作する必要がありました。つまり、開発者は、Base64データをデコードした後の「実際の」データは約nバイトであると仮定することができます。その結果、より良い記憶管理を行うことができました。

今日はそれ以上は重要ではありませんが、リソースが限られた日に戻って、これは良いことでした。

更新:私は5年後にdownvoteを取得するとは思っていませんでしたが、今私は私の答えで問題を見ることができます。私たちは皆年を取ると思う。 ;)親愛なる訪問者は、塩の穀物でこの答えをお楽しみください。

+0

'firstColumn'と' thirdColumn'の整数変数を仮定します。単純な整数演算のように見えます(3列目): 'firstColumn = 3Column * 3/4' *どのプラットフォームでも実行できます)! – Hemant

関連する問題