繁体   English   中英

如何在不知道原始类型的情况下将缓冲区转换为字符串/数字/日期

[英]How to convert a buffer to string/number/date without knowing the original type

我正在编写一个连接到 HBase 并支持不同 GET/POST 查询的查询服务。 检索到的数据是一个对象数组,其中键是列的名称,值是一个缓冲区

但是,对象的每一列的简单columns[columnName].toString()不起作用,因为有些字段可以是字符串、日期或数字。 .toString适用于字符串/日期,但数字以如下格式返回: "all": "\\\\\\\\�",

蛮力(我确实意识到我正在测试的东西不是一个漂亮的代码)方法是这样的:

function parseEntry(entry) {
    let parsed = {};
    Object.keys(entry.columns).forEach(column => {
        const value = entry.columns[column].value;
        parsed[column] = (typeof value === 'object' && value.length <= 8) ?
            value.readInt32BE(4) :
            value.toString();

    });

    return parsed;
}

但有时我会得到长度< 8字符串,我会尝试将它们转换为数字,这是不受欢迎的行为。 我还尝试使用/[^\-\￿]+/.test(value)类的正则表达式测试该值,但由于某种原因,每个条目的测试都返回 false。

我尝试了.toStringJSON.parse.trimreadInt32BE等的所有可能组合,但我没有成功正确解析这样的对象。 有没有一种方法可以根据列的名称在没有很多 if 条件的情况下正确地做到这一点?

编辑:我的响应数组中的条目看起来像这样(如果它可以帮助您测试事物;出于安全目的,我删除了一些字段; all字段all应该是数字, cUSfs应该是日期, fqdn它是一个字符串, val是一个 IP这也是一个字符串)。

{ 'd:all': 
      { value: <Buffer 00 00 00 00 00 00 04 8e>,
        timestamp: [Int64 value:1553606385109 octets:00 00 01 69 ba 28 1d d5] },
     'd:cUS': 
      { value: <Buffer 32 30 31 39 2d 30 33 2d 32 36 54 31 32 3a 35 36 3a 30 39 2e 31 37 37 5a>,
        timestamp: [Int64 value:1553604980146 octets:00 00 01 69 ba 12 ad b2] },
     'd:fqdn': 
      { value: <Buffer 61 70 69 2d 67 6c 6f 62 61 6c 2e 6e 65 74 66 6c 69 78 2e 63 6f 6d>,
        timestamp: [Int64 value:1553606699454 octets:00 00 01 69 ba 2c e9 be] },
     'd:fs': 
      { value: <Buffer 32 30 31 39 2d 30 33 2d 32 32 54 31 35 3a 30 30 3a 31 33 2e 35 30 32 5a>,
        timestamp: [Int64 value:9005645987910764 octets:00 1f fe 96 5a 15 14 6c] },
     'd:val': 
      { value: <Buffer 35 32 2e 32 30 39 2e 31 33 30 2e 31 37 32>,
        timestamp: [Int64 value:1553606699454 octets:00 00 01 69 ba 2c e9 be] },
}

您可以使用以下命令将字符串转换为数字。 \代表一个字符,因此您只需使用. 匹配它。 然后使用String#charCodeAt您可以将其转换为数字。

charCodeAt() 方法返回一个 0 到 65535 之间的整数,表示给定索引处的 UTF-16 代码单元。

 const res = "\\\\\\\\�" .match(/./g) .map(v=>v.charCodeAt()); console.log(res);

但一般来说,您需要条件来检查您应该使用什么方法来转换缓冲区。

这可以通过Buffer包完成,通过将类型(十六进制、二进制、utf8(默认)或 ascii)作为参数传递。

暂无
暂无

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM