2013-12-23 1 views
5

ここで0xFFが何であるか分かりません... バイナリコードが8ビット長であること、または符号付き/符号なしエンコーディングと関係があることを確認するだけですか? ty。charCodeAt(...)と0xffは何を成し遂げますか?

var nBytes = data.length, ui8Data = new Uint8Array(nBytes); 

for (var nIdx = 0; nIdx < nBytes; nIdx++) { 
    ui8Data[nIdx] = data.charCodeAt(nIdx) & 0xff; 
} 

XHR.send(ui8Data); 
+0

0xFFは255の16進数です。下位8ビットを「選択」する方法として、charCodeAt(nIdx)に255をマスクしています。 – vcsjones

+0

この質問には、タイトルよりも多くのことがあります。 「重複する」質問は、ビットマスキングとは関係ありません。 –

+0

しかし、この質問の重複かもしれません:http://stackoverflow.com/questions/20486551/javascript-function-to-convert-utf8-string/20487371#20487371 –

答えて

7

あなたは最初の推測で正しいです。 data.charCodeAtによって返されるものの最下位8ビットだけが必要です。

charCodeAtは、0..65536の範囲の値を返します。このコードは、その範囲を0..255に切り詰めます。効果的には、文字列内の各16ビット文字を取ります.8ビットに収まると仮定し、上位バイトをスローします。

+0

OK ..ここで私が実際に理解していないもの..データにファイルからのデータが含まれていると、charがどのように見えるかわからないので、どの部分を保持しますか? - データが01010101 11110000のように見える場合 - 255とANDをとると何が残るのですか?多分私は最下位ビットが何であるか理解していません。 – Ray

+0

@レイその質問をテストするためには(簡単に)(http://jsfiddle.net/92g9X/)です。あなたのバイトが0x99f0なら、 '0x99f0&0x00ff'(' 0x99f0&0xff'と同じ)は0xf0を与えます。あなたがファイルを読んでいるのであれば、ファイルのエンディアンを自分で処理しなければならないと思います。あなたがリトルエンディアンであることが分かっているなら、 '0x99f0&0xff00 >> 8'でそれを自分で手動で計算しなければなりません。ユニコード値が適切な範囲にあるかどうかを確認するには、リンク先の質問を確認してください。 –

+1

ok..i私はそれを持っていると思う..エンディアンは私が理解しなかったものだった。最下位バイトはリトルエンディアンのメモリに最初に来る..これはsendAsBinary関数であり、もし私が理解していることが正しいなら、ビッグエンディアンシステムの場合、charが1バイト以上取れれば、非常に.. – Ray

関連する問題