JavaScript 将二进制数据转换为具有字节顺序的数字
Binary data to Number with endianess convert in JavaScript
我收到了字符串形式的二进制数据,如何将其转换为小端 CPU 的 JS 数字? ArrayBuffer、DataView有用吗?
不只是基数转换问题。
16 in 2 radix is 10000 not 10000000
但我必须用内存地址转换并得到数字值。
var binary = "10000000"; // 16
parseInt("10000000", 2) // 128
// Buffer 10 00 00 00
// Little Endian 00 00 00 10
// 0x00000010 => 16
这是手动使用 lodash 的答案。但我想知道 JavaScript ArrayBuffer 和 DataView 的使用方法。
var _ = require('lodash');
var endianness = null;
(function () {
var b = new ArrayBuffer(4);
var a = new Uint32Array(b);
var c = new Uint8Array(b);
a[0] = 0xdeadbeef;
if (c[0] === 0xef) {
return endianness = 'LE';
} else if (c[0] === 0xde) {
return endianness = 'BE';
}
throw new Error('Unknown endianness');
})();
function toInt(binStr) {
if (binStr % 2 !== 0) {
throw new Error('Invalid binary string');
}
var arr = _.chunk(binStr, 2);
if (endianness === 'LE') {
arr = arr.reverse();
}
var converted = _.flatten(arr).join('');
return parseInt(converted, 16);
}
感谢支持!
不确定这是否是最佳方式,但它有效(对于 32 位值):
var toInt = function(binStr) {
var int = parseInt(binStr, 16);
var view = new DataView(new ArrayBuffer(4));
view.setUint32(0, int, endianness === 'LE');
return view.getUint32(0, false);
};
console.log( toInt('10000000') );
我收到了字符串形式的二进制数据,如何将其转换为小端 CPU 的 JS 数字? ArrayBuffer、DataView有用吗?
不只是基数转换问题。
16 in 2 radix is 10000 not 10000000
但我必须用内存地址转换并得到数字值。
var binary = "10000000"; // 16
parseInt("10000000", 2) // 128
// Buffer 10 00 00 00
// Little Endian 00 00 00 10
// 0x00000010 => 16
这是手动使用 lodash 的答案。但我想知道 JavaScript ArrayBuffer 和 DataView 的使用方法。
var _ = require('lodash');
var endianness = null;
(function () {
var b = new ArrayBuffer(4);
var a = new Uint32Array(b);
var c = new Uint8Array(b);
a[0] = 0xdeadbeef;
if (c[0] === 0xef) {
return endianness = 'LE';
} else if (c[0] === 0xde) {
return endianness = 'BE';
}
throw new Error('Unknown endianness');
})();
function toInt(binStr) {
if (binStr % 2 !== 0) {
throw new Error('Invalid binary string');
}
var arr = _.chunk(binStr, 2);
if (endianness === 'LE') {
arr = arr.reverse();
}
var converted = _.flatten(arr).join('');
return parseInt(converted, 16);
}
感谢支持!
不确定这是否是最佳方式,但它有效(对于 32 位值):
var toInt = function(binStr) {
var int = parseInt(binStr, 16);
var view = new DataView(new ArrayBuffer(4));
view.setUint32(0, int, endianness === 'LE');
return view.getUint32(0, false);
};
console.log( toInt('10000000') );