4

私はプロジェクトでビット単位の操作をしています。組み込みの型付き配列が頭痛を緩和し、多分パフォーマンスの向上をもたらしてくれるのだろうかと思います。JavaScriptで型付き配列を使用して4倍のUint8をUint32に変換できますか?

let bytes = [128, 129, 130, 131] 
let uint32 = (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3] 
//=> -2138996093 

同じ回答を得るために型付き配列を使用できますか?

// not actually working ! 
let uint8bytes = Uint8Array.from(bytes) 
let uint32 = Uint32Array.from(uint8bytes)[0] 
//=> ideally i'd get the same value as above: -2138996093 

サイド質問:

私はそれが奇妙上記uint32が負であることがわかった - 明らかではない示唆VARの名前として非常に... 符号なし ...

バイナリオクテットをマッシュアップして解析すると、肯定的な回答が得られます

//   128   129   130   131 
 
let bin = '10000000' + '10000001' + '10000010' + '10000011' 
 
let uint32 = Number.parseInt(bin,2) 
 

 
console.log(uint32) 
 
// 2155971203

それは私が各外の正しい値を取得するためのプロセスを逆にすることができますが、手順1が負であるが、手順2が正である理由私は理解していない何も驚きではありません。

let a = -2138996093; 
 
let b = 2155971203; 
 

 
// two's compliment, right? 
 
console.log(a.toString(2)) // -1111111011111100111110101111101 
 
console.log(b.toString(2)) // 10000000100000011000001010000011 
 

 
console.log(a >> 24 & 255) // 128 
 
console.log(a >> 16 & 255) // 129 
 
console.log(a >> 8 & 255) // 130 
 
console.log(a >> 0 & 255) // 131 
 

 
console.log(b >> 24 & 255) // 128 
 
console.log(b >> 16 & 255) // 129 
 
console.log(b >> 8 & 255) // 130 
 
console.log(b >> 0 & 255) // 131

+0

UNSIGNED int32から負の数を得ることはできません! –

+0

@ JaromandaX私は*私の質問の途中でコメントしました:\ – naomik

+0

なぜInt32Arrayを試してみませんか? –

答えて

2

これを処理するための最良の方法は、DataViewのである - あなたが取得したい値のendiennessを指定することができますそのように - あなたのコードは、INT32

ためbigendien値を使用しています
let bytes = [128, 129, 130, 131]; 
let uint8bytes = Uint8Array.from(bytes); 
let dataview = new DataView(uint8bytes.buffer); 
let int32le = dataview.getInt32(0, true); // second parameter truethy == want little endien 
let int32be = dataview.getInt32(0); // second parameter absent or falsey == want big endien 
console.log(int32le); // -2088599168 
console.log(int32be); // -2138996093 

理由

let uint32 = (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3] 

はSIGNED intを返します。ビット単位の演算子(<<,|)は符号付き32ビット値に強制します

+0

これはまさに私が探していたものです^ _ ^ – naomik

関連する問題