2017-11-07 16 views
1

私はgps座標を表す浮動小数値を持っており、32ビットの16進文字列に変換するのが好きでした。浮動小数点数をJavaScriptの32ビット16進数文字列に変換

私はすべての解決策を説明しましたhereしかし、毎回、結果は私が期待しているものではありません。例えば

は、 'ToHex' 機能のほとんど:

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

'2d.56d0b30b5aa8' 私を返しますが、mostコンバータは

を返すように私は結果は '42355b43' を期待していますJavaScriptの結果として私がどのように '42355b43'を得ることができるか知っていますか?

ありがとうございました!

+0

、JavaScriptの番号は64ビット値ではなく、32 – Pointy

+0

[OK]をしかし、私が思う私のバンはそれを切り捨て、32ビット進値が必要ですか? – Aznhar

答えて

1

あなたがArrayBufferDataViewTypedArrayオブジェクトを取ることができます。

次に、値をfloat 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

私は最終的に私自身の機能をコード化することにしました。それは人々を助けることができるので、私はここに投稿:

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); 
} 
関連する問題