繁体   English   中英

如何将Bigtable HBase API返回字节数组转换为整数或浮点nodeJS?

How to convert Bigtable HBase API returning byte array to integer or float in nodeJS?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在将数据从dataflow写入bigtable,并且需要从NodeJS检索数据,但是意识到数据是字节数组。 如何转换回整数或浮点数?

键“\\ u0000 \\ u0000 \\ u0000 \\ u0000”原来是0,但我永远无法在我的nodeJS代码中正确输出它。

我已经使用Buffer,bin2string,byteArrayToLong尝试了以下方法,但它们都没有正常工作。 以下是查询数据的代码。

async function query(table, start, end) {
  return new Promise((resolve, reject) => {
    table.createReadStream({
      start: start,
      end: end
    }).on('data', function(row) {
        for(var key in row.data.ch){
            console.log(JSON.stringify(key));               // Output: "\u0000\u0000\u0000\u0000"
            console.log(`bin2string: ${bin2string(key)}`);  // Output: bin2string:

            let keybuf = Buffer.from(key);
            console.log(keybuf);                            // Output: <Buffer 00 00 00 00>
            console.log(keybuf.toString('utf8'));           // Output:
            const utf16Buffer = Buffer.from(key,'utf16le'); // Output: <Buffer 00 00 00 00 00 00 00 00>
            console.log(utf16Buffer);
            console.log(utf16Buffer.toString());            // Output:
            console.log(byteArrayToLong(key));              // Output: NaN
        }
      // Nothing to do with data
      // We can measure the time needed to get the first row
    }).on('end', function(){
      resolve();
    });  
  });
}

function bin2string(array){
    var result = "";
    for(var i = 0; i < array.length; ++i){
        result+= (String.fromCharCode(array[i]));
    }
    return result;
}

function byteArrayToLong (byteArray){
    var value =0;
    for(var i=byteArray.length-1; i>=0; i--){
        value = value*256 + byteArray[i];
    }
    return value;
}
2 个回复

我对你的问题没有完整的答案,但我有一些指示。

Cloud Bigtable数字都是“64位整数编码为8字节的大端值”(参见此处 )。 Node.js longs“endian-ness”是系统特定的(见这里 )。 PHP与Cloud Bigtable有类似的问题(见这里 )。

在Java中,所有数值都是big-endian。 HBase Bytes类完成数字和字节之间的所有转换( 源代码 ),并可能提供一些线索。

可能会在https://github.com/googleapis/nodejs-bigtable/issues上发布问题以获得更好的解决方案。

对于整数,下面的函数可以工作。

function byteToInt(x){
    let val=0;
    for (let i=0; i<x.length; ++i) {        
        val+=x[i];        
        if(i<x.length-1) val = val << 8;
    }
    return val;
}

对于float,NodeJS已经提供了一个从Buffer读取的方法:

let buf = Buffer.from(value, 'binary');
let num = buf.readFloatBE(0);

也可以使用下面的内容,具体取决于字节顺序和位数:

buf.readInt8(偏移)

buf.readInt16BE(偏移)

buf.readInt16LE(偏移)

buf.readInt32BE(偏移)

buf.readInt32LE(偏移)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题
 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM