[解決済み] なぜbase64エンコーディングでは、入力長が3で割り切れない場合、パディングが必要なのですか?
質問
base64エンコーディングにおけるパディングの目的は何ですか。以下は、wikipediaからの抜粋です。
追加のパッド文字が割り当てられており、これを使用してエンコード出力を4文字の整数倍(またはエンコードされていないバイナリテキストが3バイトの倍数でない場合は同等)に強制することができます。これらのパディング文字はデコード時に破棄されなければなりませんが、入力バイナリ長が3バイトの倍数ではない場合、エンコードされていないテキストの有効長の計算を可能にします(最後の非パッド文字は通常、それが表す最後の6ビットブロックの最下位ビットがゼロパッドされるようにエンコードされ、最大2文字のパッド文字はエンコードストリームの最後に発生するかもしれません)。 "。
任意の文字列をbase64エンコードし、任意のbase64エンコードされた文字列をデコードするプログラムを書きました。パディングはどのような問題を解決するのでしょうか?
どのように解決するのですか?
パディングは不要という結論は正しい。エンコードされた配列の長さから、入力の長さを曖昧さなく決定することは常に可能なのです。
しかし、例えば非常に単純なネットワークプロトコルのように、base64エンコードされた文字列を連結して個々の配列の長さが失われるような状況では、パディングが有効です。
もし パディングなし の文字列を連結した場合、個々の文字列の末尾の奇数バイトの情報が失われるため、元のデータを復元することは不可能である。しかし、パディングされた文字列を用いれば、曖昧さがなく、文字列全体として正しく復号することができる。
編集:図解
単語をbase64エンコードして連結し、ネットワークで送信するプログラムがあるとする。I"、AM"、TJM"をエンコードし、その結果をパディングなしで連結して送信します。
-
I
にエンコードします。SQ
(SQ==
パディング付き) -
AM
にエンコードします。QU0
(QU0=
パディング付き) -
TJM
にエンコードします。VEpN
(VEpN
パディング付き)
つまり、送信データは
SQQU0VEpN
. 受信者はこれを以下のようにBase64デコードします。
I\x04\x14\xd1Q)
でなく、意図した
IAMTJM
. この結果はナンセンスで、送信者が
各単語がどこで終わるかの情報を破壊した
をエンコードしたシーケンスで もし送信者が
SQ==QU0=VEpN
の代わりに、受信者はこれを3つの別々のbase64シーケンスとしてデコードし、それを連結することで
IAMTJM
.
なぜパディングが必要なのか?
なぜ、各単語の前に整数の長さを付けるようにプロトコルを設計しないのでしょうか?そうすれば、受信者はストリームを正しくデコードでき、パディングは不要になります。
それは素晴らしいアイデアです。 知る エンコードを開始する前に、エンコードするデータの長さを決定します。しかし、言葉ではなく、ライブカメラの映像の塊をエンコードしていたらどうでしょう?各チャンクの長さを事前に知ることはできないかもしれません。
もしプロトコルにパディングが使われていれば、長さを送信する必要は全くありません。カメラから送られてくるデータをそのままエンコードし、各チャンクをパディングで終了させれば、受信者はストリームを正しくデコードすることができるのです。
もちろん、これは非常に不自然な例ですが、なぜパディングが役立つ場合があるのかを説明することができます。
関連
-
[解決済み] " ' "の代わりに "â €™ "が表示されます。
-
[解決済み] MIMEエンコードされたquoted-printableテキスト中の"=C2=A0 "とは何ですか?
-
[解決済み] " ' "の代わりに "â €™ "が表示されます。
-
[解決済み] Base64エンコーディングは何に使うのですか?
-
[解決済み] base64でエンコードされた文字列の最後に=記号があるのはなぜですか?
-
[解決済み] Sublime Textでファイルの現在のエンコーディングを確認するにはどうすればよいですか?
-
[解決済み】PowerShellでBOMなしのUTF-8でファイルを書き込む場合
-
[解決済み] Base64の長さ計算?
-
[解決済み] エンコーディングと文字コードの違いは何ですか?
-
[解決済み] " ' "の代わりに "â €™ "が表示されます。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] " ' "の代わりに "â €™ "が表示されます。
-
[解決済み] MIMEエンコードされたquoted-printableテキスト中の"=C2=A0 "とは何ですか?
-
[解決済み] " ' "の代わりに "â €™ "が表示されます。
-
[解決済み] なぜbase64エンコーディングでは、入力長が3で割り切れない場合、パディングが必要なのですか?
-
[解決済み] Base64エンコーディングは何に使うのですか?
-
[解決済み] base64でエンコードされた文字列の最後に=記号があるのはなぜですか?
-
[解決済み】PowerShellでBOMなしのUTF-8でファイルを書き込む場合
-
[解決済み】JavaScriptでファイルをbase64に変換する方法は?
-
[解決済み] Base64 Javaによる文字列のエンコードとデコード [重複]。
-
[解決済み] エンコーディングと文字コードの違いは何ですか?