如何在nodejs中将返回字节数组的bigtable hbase api转换为整数或浮点?

3qpi33ja  于 2021-06-09  发布在  Hbase
关注(0)|答案(2)|浏览(424)

我正在将数据流中的数据写入bigtable,需要从nodejs检索数据,但意识到数据是在字节数组中。如何转换回整数或浮点?
键“\u0000\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;
}
sg24os4d

sg24os4d1#

我对你的问题没有完整的答案,但我有一些建议。
cloud bigtable数字都是“编码为8字节big endian值的64位整数”(参见这里)。node.js longs“endian ness”是特定于系统的(请参见此处)。php在cloud bigtable中也有类似的问题(参见这里)。
在java中,所有的数值都是大端的。hbase Bytes 类完成数字和字节之间的所有转换(源代码),并可能提供一些线索。
它可能是愤怒的张贴上的问题https://github.com/googleapis/nodejs-bigtable/issues 得到更好的解决方案。

dy1byipe

dy1byipe2#

对于整数,下面的函数将起作用。

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已经提供了从缓冲区读取的方法:

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

也可以使用以下选项,具体取决于位的结束度和位数:
基本读数8(偏移)
基本读数16BE(偏移)
buf.readint16le(偏移)
buf.readint32be(偏移)
buf.readint32le(偏移)

相关问题