11

6000 要素のデータ構造があり、要素ごとに 7 ビットの情報を格納する必要があります。数値で満たされた 6000 個の要素の配列として素朴に保存すると、約 22 KB を占めます。ページのサイズを縮小しようとしています - 6000*7 ビットの情報を格納する最善の方法は何ですか (約 5 KB である必要があります)。「ビットストリーム」のようなデータ構造が必要です。文字列や画像にエンコードすることを考えましたが、正確にはわかりません。文字列としてエンコードしなかった理由は、どの文字も印刷できない ASCII 文字 (ASCII 1-25 など) ではないことを数学的に保証できないためです。

4

3 に答える 3

1

実際には、JSON を使用して潜在的な問題を JS エスケープ コードにエンコードすると、文字列は正常に機能します。

var codes=",Ñkqëgdß\u001f", // (10 chars JSON encoded to store all chars ranges)
mySet=codes[4].charCodeAt().toString(2).split("").map(Number).map(Boolean).reverse();

alert(mySet); // shows: [true,false,false,false,true,true,true] 


/*  broken down into bite-sized steps: (pseudo code)
char == "g" (codes[4])
"g".charCodeAt() == 103
(103).toString(2) == "1100111"
.split().map(Number) ==  [1,1,0,0,1,1,1]
.map(Boolean).reverse() == [true,true,true,false,false,true,true]  */

配列を埋めるには、プロセスを逆にします。

var toStore= [true, false, true, false, true, false, true];
var char= String.fromCharCode(parseInt(toStore.map(Number).reverse().join(""),2));
codes+=char;

//verify (should===true):   
codes[10].charCodeAt().toString(2).split("")
   .map(Number).map(Boolean).reverse().toString() === toStore.toString();

結果を ascii ファイル、JSON.stringify(codes) にエクスポートするには、または localStrorage に保存する場合は、ブラウザーが localStorage の 1 文字あたり 2 バイトを使用するため、生の文字列変数を保存するだけです...

于 2013-06-24T21:07:46.040 に答える