JavaScriptで文字列のビットを数える方法は? たとえば、文字列の長さは何ビット0000xfe-kemZlF4IlEgljDF_4df:1102pwrq7
ですか?
3 に答える
提供される文字列 ("0000xfe-kemZlF4IlEgljDF_4df:1102pwrq7") は次のようになります。
length * 2 * 8
ビット長、または592 ビット.
これは、少なくとも最も一般的な主流の実装では、文字列内の各文字が 16 ビットの符号なし値として扱われるためです。これの詳細についてはおそらく議論することができますが、コメントでセキュリティ上の目的であると述べています-
したがって、ASCII 文字 (0 ~ 127) または UTF-8 (0 ~ 255) を指定すると仮定すると、TextEncoder
オブジェクトを使用して、128 ビットを生成するのに十分な文字を提供することができます。UTF-8 の Latin-1 文字には注意してください。エンコーダーがそれらを UTF-16 に相当するものに投影する可能性があるため、1 バイトではなく 2 バイトが生成されることを意味します。
プレーンな JavaScript 文字列を使用して ASCII 文字を保持すると、半分の位置が 0 として表され、セキュリティが大幅に低下するため、UTF-16/UCS-2 から ASCII または UTF-8 へのエンコードが必要になります。
TextEncoderを使用するには、16 文字を表す文字列を提供するだけです。この時点では 256 ビット (16x16) ですが、各文字は ASCII/UTF-8 値の範囲内にあります。エンコード後、特殊な文字が使用されていない限り、型付き配列としてのバイナリ バッファは 128 ビット (16x8) を表す必要があります。
例
if (!("TextEncoder" in window)) alert("Sorry, no TextEncoder in this browser...");
else {
btn.onclick = function() {
var s = txt.value;
if (s.length !== 16) {
alert("Need 16 chars. " + (16 - s.length) + " to go...");
return
}
var encoder = new TextEncoder("ASCII"); // or use UTF-8
var bytes = encoder.encode(s);
console.log(bytes);
if (bytes.byteLength === 16) alert("OK, got 128 bits");
else alert("Oops, got " + (bytes.byteLength * 8) + " bits.");
};
}
<label>Enter 16 ASCII chars: <input id=txt maxlength=16></label>
<button id=btn>Convert</button>
古いブラウザーを使用している場合に代わる方法TextEncoder
は、文字列を手動で反復処理し、各文字を抽出してマスクし、そこからバイナリ配列を構築することです。
あなたが言うように、指定された値が少なくとも 128 ビットであることを確認する必要があるだけの場合、おそらくこの文字列を、文字列を何らかのバイト表現に変換する何かに渡します。文字列がバイトに変換される方法は、エンコード方法によって異なります。
お送りいただいたサンプル文字列には、ASCII 範囲の文字が含まれています。文字列が ASCII としてエンコードされている場合、1 文字あたり 8 ビットです。文字列が UTF-8 としてエンコードされた場合、1 文字あたり 8 ビットになりますが、指定したサンプルよりも大きな文字値が文字列に含まれる可能性がある場合、文字によっては 1 文字あたり 8 ビットを超える可能性があります。UTF-16 としてエンコードされている場合、各文字は最小 16 ビットですが、文字によってはそれ以上になる可能性があります。USC-2 としてエンコードされている場合は、常に 1 文字あたり 16 ビットになります。
この要件がどこから来たのか、この文字列を必要とするシステムがそれをどのように使用するのかはわかりません。システムが文字ごとに固定数のビットを使用する場合、これはlength
、文字列の を取得して適切な数を掛けるのと同じくらい簡単です。それほど簡単ではない場合は、適切なエンコーディングを使用して文字列をエンコードする必要があります(ほとんどの場合、バイト配列)。その後、バイト数に 8 * を掛けてビット数を取得します。
文字列をバッファにコピーして、バッファの長さを確認できますか?
var str = ' ... ';
var buf = new Buffer(str);
console.log(buf.length);