2

私は JavaScript で非常に不潔なことをしており、奇妙な問題に遭遇しました。

静的サイズのバッファーを満たすバイナリ データを作成しています。内容がバッファを満たさない場合、残りはヌル文字で埋められます。

次のステップは、base64 に変換することです。

サイズ (バイト) は常に 3 の倍数であるとは限らないため、最後にパディングを追加する必要がある場合があります。バッファー内の最後のバイトは常に null です (実際には、約 1 KB の null です)。

これを Firefox と Chrome で base64 に変換するとERR_INVALID_URL、末尾に「=」があるとエラーが発生しますが、そうでない場合は正常にダウンロードされます。

例えば:

var url = "data:application/octet-stream;base64,";

window.open(url + "AAAA"); // works
window.open(url + "AAAA="); // doesn't work
window.open(url + "icw="); // works

私のファイルは機能しますが、仕様に達していません。

これが無効な base64 である理由はありますか? さらに重要なことに、これはバグですか、それとも仕様の一部ですか?

編集:

Firefox と Chrome の間のいくつかの奇妙な点を示す回答を投稿しました。標準が何を指定しているか知っている人はいますか? それとも、断片化を引き起こす緩い仕様の 1 つですか? できれば決定的なものが欲しいです。

4

3 に答える 3

5

パディング文字=は、4 つのコード文字の倍数まで埋めるために使用されます。入力の 3 バイトごとに出力の 4 バイトにマップされるため、3 の倍数ではない入力バイト数にはパディングが必要です (残りの 1 バイトには が必要==で、残りの 2 バイトには が必要=です)。

あなたの場合AAAA、すでに有効なコードワードであり、パディングは必要ありません。

于 2011-06-04T17:20:38.717 に答える
2

さまざまなブラウザに関する注意:

  • クロム
    • datalength % 4 === 1-単一の等しいが必要です
    • datalength % 4 === 2-2つの等しいが必要です
  • Firefox-等号はオプションですが、Chromeと同じ規則に従います

これは私がそれをテストするために使用した行です(私はAAAAAA ==を毎回異なる文字列に置き換えました):

var url = "data:application/octet-stream;base64,AAAAAA=="; window.open(url);

また、FirefoxとChromeはどちらも+&を使用しますが、とは使用/しません。-_

ソース:

Chrome11とFirefox4を使用したUbuntu11.04でのテスト。

編集:

これが必要なコードは、Javascript用のtarユーティリティです。私のコードはそのまま動作しますが、可能な限り標準に準拠したいので、1バイトが不足していると思います。Linuxのtarはそれを認識するので、大したことはありません。

于 2011-06-04T17:50:00.117 に答える
2

文字列の末尾に「=」文字を追加するとうまくいくと思うのはなぜですか? これは base64 では有効な文字ではありません。

文字セットは大文字と小文字です。数字; および「+」および「/」。したがって、それ以外は base64 文字列では有効ではありません。

編集— URL の場合、"+" と "/" の代わりに "-" と "_" (文字セットの 62 と 63 の位置) を使用しているようです。

もう少し編集してください。これは、明らかに権威があるが矛盾するさまざまな情報源が存在するため、非常に紛らわしいトピックです。たとえば、データ URL スキームに関する Mozilla の説明では、「ファイル名に適した」代替エンコーディングの使用については言及されていません。IETF データ URL RFC についても同様です。ただし、他の IETF ドキュメントでは、問題のある (ファイル名の) "+" と "/" を "-" と "_" に置き換えて、バリエーションを明確に議論し、指定しています。

したがって、私は自分自身を無知であると宣言します :-) あなたが受けている苦情は間違ったパディング (つまり、パディングが実際には必要ないのにパディング) に関するものであるというガンボはおそらく正しいでしょう。

于 2011-06-04T17:12:43.857 に答える