3バイトのまとまりとパディングから計算

RFC 4648の標準Base64は入力3バイトを出力4文字で表します。末尾が1バイトなら==、2バイトなら=、3バイトならパディングなしです。改行を追加しないパディング付きの長さは4 * Math.ceil(n / 3)です。nは入力バイト数で、0なら長さも0です。

n = new TextEncoder().encode(input).length
length = 4 * Math.ceil(n / 3)

f     1   Zg==       4
fo    2   Zm8=       4
foo   3   Zm9v       4
foob  4   Zm9vYg==   8

固定例を実際の関数で実行しました。f、fo、fooは入力長が異なっても出力が4文字で、パディングが異なります。4バイトのfoobは8文字です。パディングは末尾の形式を示し、原文に追加された文字ではありません。

入力1・2・3・4バイトと、Base64出力4・4・4・8文字、パディング==・=・なし・==の比較。
例を計算して制作した図です。左の数字は入力バイト数、文字列は実際の出力です。転送全体の容量を測定したものではありません。 右の数字は出力文字数です。

RFC 4648: Base 64 Encoding

文字数・バイト数・改行を区別

MoyoutilはTextEncoderで入力をUTF-8バイトに変換します。例の가は3バイトで、6rCAという4文字になります。fの後にLF改行を入れると2バイトでZgo=です。エンコードでは原文の空白と改行もデータです。HTTPヘッダー、JSONの外側の構造、データURLの接頭辞は式に含みません。

base64("가")     // 6rCA
base64("f\n")  // Zgo=

WHATWG Encoding: TextEncoder

Base64ツールに原文を入力し、エンコードを選びます。デコードには標準Base64の出力だけを入力してください。デコード時は入力の空白を除去しますが、エンコード時は原文の空白を保持します。Base64URLの-と_、任意のバイナリファイル復元には対応しません。/w==はBase64として読めてもUTF-8テキストでないためエラーです。入力を変更すると古い結果とコピーが無効になるので、再変換してください。

よくある質問

出力は常に約33%増えますか?

大きな入力では比率が4/3に近づきますが、小さな入力ではパディングの影響が大きくなります。1バイトは4文字です。入力バイト数とパディングの有無を確認して正確な長さを計算してください。

空の入力は画面でも0文字に変換できますか?

式は0バイトで0を返しますが、Moyoutilの画面は空の入力を実行すると内容の入力を求めるエラーを表示します。式の境界値と画面の入力方針は異なります。