2017-04-05 7 views
2

何も情報なしで哀れな文書に基づいて何かを実装しています。16進文字列INT32 - リトルエンディアン(DCBA形式)Javascript

の例では、ちょうどこの

(7F02AAF7)H => (F7AA027F)H = -139853185 

だが、私はF7AA027F7F02AAF7を変換した場合でも、その後、まだ 'parseInt('F7AA027F', 16)'を介して出力は私が期待していたものとは異なっているとしましょうです。

は、私はいくつかのGoogle検索を行なったし、あなたが入力 7F02AAF7、それが INT32 - Little Endian (DCBA)システムの下で、希望数に加工されたときに http://www.scadacore.com/field-tools/programming-calculators/online-hex-converter/

ここでは、このウェブサイトを見つけました。私はこの検索語を試しましたが運はありませんでした。 私はここで何をすべきか正確に教えてもらえますか?これで私を助けるnode.jsライブラリがありますか?

+0

*「期待しているものとは違う」* - あなたは何を期待していますか? –

+0

私は10進値 '-139853185'を期待していますか?これは、人々が一般的にjsで十進数から十進数に使用するものです。 @ArtjomB。 – DeathNote

+0

私はエンディアンスワッピングも試みました。これはうまくいきませんでした:l – DeathNote

答えて

2

あなたはT.J. Crowderの優れたanswerを適応し、DataView#getInt32とlittleEndianのための指標を与えられたバイトのためDataView#setUint8を使用することができます。

var data = '7F02AAF7'.match(/../g); 
 

 
// Create a buffer 
 
var buf = new ArrayBuffer(4); 
 
// Create a data view of it 
 
var view = new DataView(buf); 
 

 
// set bytes 
 
data.forEach(function (b, i) { 
 
    view.setUint8(i, parseInt(b, 16)); 
 
}); 
 

 
// get an int32 with little endian 
 
var num = view.getInt32(0, 1); 
 
console.log(num);

+0

これはどの値にする必要がありますか?私は '45053560'を得る。 –

+0

くそっ...他の場所で正しく動作します – DeathNote

2

ノードはかなり簡単buffersを使用してその操作を行うことができます。

Buffer.from('7F02AAF7', 'hex').readInt32LE() 
+1

このソリューションのRobertに感謝します。 – DeathNote

1

通常Number valueとして格納されているJavaScriptの整数:

4.3.19倍精度64ビットバイナリフォーマットIEEE 754値

に対応 プリミティブ値そこでparseIntの結果は、値が可逆フロート(52ビット容量)の小数部に嵌合するフロートです。 parseIntも2補数表記として解析されません。

読んでいるものを32ビットに強制したいのであれば、バイナリ操作を適用して自動的に32ビットに変換するのが最も簡単です。私はお勧め:0と

parseInt("F7AA027F", 16) | 0 

バイナリOR(|)は、本質的に何もしませんが、それは32ビットまでの任意の整数に変換します。このトリックは、数値を32ビットに変換して計算を高速化するためによく使用されます。

また、これは移植性があります。

+0

説明をありがとうございました。 – DeathNote

関連する問題