2017-11-07 11 views
1

나는 gps 좌표를 나타내는 float 값을 가지고 있으며 32 비트 16 진수 문자열로 변환하는 것을 좋아했습니다.float를 JavaScript의 32 비트 16 진수 문자열로 변환

나는 모든 해결책을 here라고 묘사했지만 모든 결과는 내가 기대하는 바가 아니 었습니다. 예를 들어

는 'ToHex'대부분의 기능 :

var lat = 45.839152; 
console.log(ToHex(lat)); 

'2d.56d0b30b5aa8'저를 반환하지만 most 컨버터

를 반환으로 나는 결과를 '42355b43'를 기대하고있다 자바 스크립트에서 '42355b43'을 얻을 수있는 방법을 알고 계십니까?

감사합니다.

+0

우선, 자바 스크립트 번호는 64 비트 값되지는 32 – Pointy

+0

좋아하지만 난 32 비트 16 진수 값이 필요합니다, 나는 반은 내가 가정을자를 수있다? – Aznhar

답변

1

: 그것은 사람들을 도울 수 있도록 내가 여기에 게시.

그런 다음 값을 부동 소수점 32로 설정하고 값을 부호없는 정수 8 비트로 읽습니다.

const getHex = i => ('00' + i.toString(16)).slice(-2); 
 

 
var view = new DataView(new ArrayBuffer(4)), 
 
    result; 
 

 
view.setFloat32(0, 45.839152); 
 

 
result = Array 
 
    .apply(null, { length: 4 }) 
 
    .map((_, i) => getHex(view.getUint8(i))) 
 
    .join(''); 
 

 
console.log(result);

0

필자는 결국 내 자신의 기능을 코드화하기로 결정했습니다. 당신은 ArrayBufferDataView으로 TypedArray 객체를 취할 수

function ToHex(d) { 

    var sign = "0"; 

    if(d<0.0){ 
     sign = "1"; 
     d = -d; 
    } 

    var mantissa = parseFloat(d).toString(2); 

    var exponent = 0; 

    if(mantissa.substr(0,1) === "0"){ 
     exponent = mantissa.indexOf('.') - mantissa.indexOf('1') + 127; 
    } 
    else{ 
     exponent = mantissa.indexOf('.') - 1 + 127; 
    } 

    mantissa = mantissa.replace(".", ""); 
    mantissa = mantissa.substr(mantissa.indexOf('1')+1); 

    if(mantissa.length>23){ 
     mantissa = mantissa.substr(0,23); 
    } 
    else{ 
     while(mantissa.length<23){ 
      mantissa = mantissa +"0"; 
     } 
    } 

    var exp = parseFloat(exponent).toString(2); 

    while(exp.length<8){ 
     exp = "0" + exp; 
    } 

    var numberFull = sign + exp + mantissa; 

    return parseInt(numberFull, 2).toString(16); 
}