Hex String to INT32 - Little Endian (DCBA Format) Javascript

纵饮孤独 提交于 2020-12-31 07:48:46

问题


Implementing something based on a pathetic documentation without no info nothing.

The example is just this

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

Let's say even if I convert 7F02AAF7 to F7AA027F, then still the output via 'parseInt('F7AA027F', 16)' is different from what I am expecting.

I did some google search and found this website http://www.scadacore.com/field-tools/programming-calculators/online-hex-converter/

Here when you input 7F02AAF7 then it is processed to wanted number under INT32 - Little Endian (DCBA) system. I tried this search term but no luck. Can you please tell me what exactly am I supposed to do here and is there any node.js library which can help me with this.


回答1:


You could adapt the excellent answer of T.J. Crowder and use DataView#setUint8 for the given bytes with DataView#getInt32 and an indicator for littleEndian.

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);



回答2:


Node can do that pretty easily using buffers:

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



回答3:


JavaScript integers are usually stored as a Number value:

4.3.19
primitive value corresponding to a double-precision 64-bit binary format IEEE 754 value

So the result of parseInt is a float where the value losslessly fits into the fraction part of the float (52 bits capacity). parseInt also doesn't parse it as two-complement notation.

If you want to force anything that you read into 32 bit, then the easiest would be two force it to be automatically converted to 32 bit by applying a binary operation. I would suggest:

parseInt("F7AA027F", 16) | 0

The binary OR (|) with 0 is essentially a no-op, but it converts any integer to 32 bit. This trick is often used in order to convert numbers to 32 bit in order to make calculations on it faster.

Also, this is portable.



来源:https://stackoverflow.com/questions/43239567/hex-string-to-int32-little-endian-dcba-format-javascript

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!