191

サーバーがbase64文字列を受信し、変換する前にその長さを確認したい場合、たとえば、最終的なバイト配列を常に16KBにすることを許可したいとします。Base64文字列に変換した場合(文字ごとに1バイトを想定)、16KBバイトの配列はどのくらい大きくなる可能性がありますか?

4

5 に答える 5

279

Base64は、3バイトの各セットを4バイトにエンコードします。さらに、出力は常に4の倍数になるようにパディングされます。

これは、サイズnの文字列のbase-64表現のサイズが次のとおりであることを意味します。

ceil(n / 3) * 4

したがって、16kB配列の場合、base-64表現はceil(16 * 1024/3)* 4 = 21848バイト長〜=21.8kBになります。

大まかな概算では、データのサイズが元のサイズの4/3に増加します。

于 2011-01-17T16:34:30.060 に答える
39

ウィキペディアから

nバイトの入力が与えられた場合、出力は(n + 2-((n + 2)%3))/ 3 * 4バイトの長さになるため、入力バイトあたりの出力バイト数は4/3に収束することに注意してください。または大きいnの場合は1.33333。

したがって、16kb * 4/3は、正確には21.3'kb、つまり21848バイトをほとんど超えません。

お役に立てれば

于 2011-01-17T16:35:55.770 に答える
11

16kbは131,072ビットです。Base64は、24ビットバッファを4つの6ビット文字にパックするため、5,462 * 4=21,848バイトになります。

于 2011-01-17T16:34:46.877 に答える
6

質問は可能な限り最悪の増加についてだったので、通常、80文字ごとに改行があることを付け加えなければなりません。これは、Windowsでbase64でエンコードされたデータをテキストファイルに保存する場合、2バイトが追加され、Linuxでは各行に1バイトが追加されることを意味します。

実際のエンコーディングからの増加は上で説明されています。

于 2016-04-13T05:53:24.307 に答える
2

これは私自身の将来の参考資料です。質問は最悪の場合であるため、改行を考慮に入れる必要があります。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コアでテストすることはまだできませんでした。

于 2019-09-02T11:28:08.207 に答える