4

프로젝트에서 약간의 비트 조작을하고 있습니다. 내장형 입력 배열이 나에게 두통을 덜어주고 성능 향상을 조금 줄 수 있을지 궁금합니다.4x Uint8을 JavaScript의 입력 배열을 사용하여 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에의 이름에서 알 수 있듯이 ...

2 진수 옥텟을 매시하고 구문 분석하면 무료 긍정 응답

가 표시됩니다.

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

 
console.log(uint32) 
 
// 2155971203

내가 각 중 올바른 값을 얻을 수있는 과정을 되돌릴 수 놀랄 일이 아니다, 그러나 절차 (1)이 음수하지만 과정이 긍정적 인 이유를 이해하지 않습니다.

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