2013-07-16 8 views
3

처음에는 바보 같은 질문에 대해 유감이지만 nodejs는 새로운 것입니다. 나는 64 비트 리틀 엔디안 정수를 서명 한 소켓에서 읽고, 버퍼에 넣어, 그래서 내가 수 256 표현이 있다고 가정하자로 : 버퍼 클래스는 readInt32LE 및 readUInt32LE을 가지고 있기 때문에64 비트 리틀 엔디안 정수를 숫자로 변환하십시오.

<Buffer 00 01 00 00 00 00 00 00> 

내가 어떻게 32 비트 연산을 사용하여이 버퍼를 해당 js 수로 변환 하시겠습니까? 두 개의 32 비트 빅 엔디안 번호를 읽은 다음 어떻게 든 비트 단위로 읽어야합니까? 리틀 엔디안을 읽어야합니까?

감사

답변

2

ECMA Section 8.5 - Numbers

주 누구의 크기입니다 더 큰 53 2 이상이 (숫자 형식에서 표현할 수없는 모든 긍정과 부정의 정수 참으로, 정수 0이 두 가지 표현이있다, +0 및 -0).

자바 스크립트는 64 비트 부호있는/부호를 읽을 다음 코드를 사용할 수 있습니다, 느릅 나무 만 최대 2 53, 또는 당신을 위해 괜찮아요 경우 9007199254740992. 정확하게 숫자를 나타낼 수있는 의미, 내부적으로 64 개 비트 부동 번호를 사용 64 비트 부동 소수점으로 값 int :

function readUInt64(buff, offset) { 
    return buff.readInt32LE(offset) + 0x100000000*buff.readUInt32LE(offset + 4); 
} 

function readInt64(buff, offset) { 
    var word0 = buff.readUInt32LE(offset); 
    var word1 = buff.readUInt32LE(offset+4); 
    if (!(word1 & 0x80000000)) 
     return word0 + 0x100000000*word1; 
    return -((((~word1)>>>0) * 0x100000000) + ((~word0)>>>0) + 1); 
} 

당신이 정확한 표현을해야하는 경우 - 사용 bignumber.js 라이브러리

function readUInt64(buff, offset) { 
    var word0 = buff.readUInt32LE(offset); 
    var word1 = buff.readUInt32LE(offset+4); 
    return new BigNumber(word0).plus(new BigNumber(word1).times(0x100000000)); 
} 
관련 문제