【问题标题】:Binary data to Number with endianess convert in JavaScript二进制数据到带有字节序的数字在 JavaScript 中转换
【发布时间】:2015-08-26 11:34:59
【问题描述】:

我收到了字符串形式的二进制数据,如何使用 little endian CPU 将其转换为 JS Number? ArrayBuffer、DataView有用吗?

这不仅仅是基数转换问题

16 in 2 radix 是 10000 而不是 10000000

但我必须用内存地址转换并获取数值。

var binary = "10000000"; // 16

parseInt("10000000", 2) // 128

// Buffer 10 00 00 00
// Little Endian 00 00 00 10
// 0x00000010 => 16

这是手动使用 lodash 的答案。但我想知道 ArrayBuffer 和 DataView 的 JavaScript 方式。

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

感谢您的支持!

【问题讨论】:

    标签: javascript binary-data memory-address endianness arraybuffer


    【解决方案1】:

    不确定这是否是最好的方法,但它有效(对于 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') );
    

    【讨论】:

      猜你喜欢
      • 2012-03-14
      • 2019-01-15
      • 2012-05-08
      • 2015-08-05
      • 2016-03-22
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      相关资源
      最近更新 更多