サーバーがbase64文字列を受信し、変換する前にその長さを確認したい場合、たとえば、最終的なバイト配列を常に16KBにすることを許可したいとします。Base64文字列に変換した場合(文字ごとに1バイトを想定)、16KBバイトの配列はどのくらい大きくなる可能性がありますか?
5 に答える
Base64は、3バイトの各セットを4バイトにエンコードします。さらに、出力は常に4の倍数になるようにパディングされます。
これは、サイズnの文字列のbase-64表現のサイズが次のとおりであることを意味します。
ceil(n / 3) * 4
したがって、16kB配列の場合、base-64表現はceil(16 * 1024/3)* 4 = 21848バイト長〜=21.8kBになります。
大まかな概算では、データのサイズが元のサイズの4/3に増加します。
ウィキペディアから
nバイトの入力が与えられた場合、出力は(n + 2-((n + 2)%3))/ 3 * 4バイトの長さになるため、入力バイトあたりの出力バイト数は4/3に収束することに注意してください。または大きいnの場合は1.33333。
したがって、16kb * 4/3は、正確には21.3'kb、つまり21848バイトをほとんど超えません。
お役に立てれば
16kbは131,072ビットです。Base64は、24ビットバッファを4つの6ビット文字にパックするため、5,462 * 4=21,848バイトになります。
質問は可能な限り最悪の増加についてだったので、通常、80文字ごとに改行があることを付け加えなければなりません。これは、Windowsでbase64でエンコードされたデータをテキストファイルに保存する場合、2バイトが追加され、Linuxでは各行に1バイトが追加されることを意味します。
実際のエンコーディングからの増加は上で説明されています。
これは私自身の将来の参考資料です。質問は最悪の場合であるため、改行を考慮に入れる必要があります。RFC 1421では最大行長を64文字と定義していますが、RFC 2045(MIME)では、最大で1行に76文字が含まれると規定されています。
後者は、C#ライブラリが実装したものです。したがって、改行が2文字(\ r \ n)であるWindows環境では、次のようになります。Length = Floor(Ceiling(N/3) * 4 * 78 / 76)
注:フローリングは、C#でのテスト中に、最後の行が正確に76文字で終了する場合、改行が続かないためです。
次のコードを実行することでそれを証明できます。
byte[] bytes = new byte[16 * 1024];
Console.WriteLine(Convert.ToBase64String(bytes, Base64FormattingOptions.InsertLineBreaks).Length);
76文字の行でbase64にエンコードされた16キロバイトの答え:22422文字
Linuxではそうなると思いますLength = Floor(Ceiling(N/3) * 4 * 77 / 76)
が、.NETコアでテストすることはまだできませんでした。