【问题标题】:JavaScript compare hex string from buffer to PythonJavaScript 将缓冲区中的十六进制字符串与 Python 进行比较
【发布时间】:2018-03-12 15:48:25
【问题描述】:

我想从Buffer 打印一个十六进制转义序列字符串。

例如:

buffer = .... // => <Buffer d3 e9 52 18 4c e7 77 f7 d7>

如果我这样做:

console.log(buffer.toString('hex'));

我明白了:

d3e952184ce777f7d7

但我希望这种表示与 \x 表示(我从 python 获取并需要比较)

\xd3\xe9R\x18L\xe7w\xf7\xd7` // same as <Buffer d3 e9 52 18 4c e7 77 f7 d7>

【问题讨论】:

  • Python 示例中的多余字符(例如 R、L、w)是怎么回事?您能否添加所需的输出是如何生成的?例如,这比 python MAX_INT 大...

标签: javascript node.js msgpack


【解决方案1】:

这似乎是你想要的:

function encodehex (val) {
  if ((32 <= val) && (val <= 126))
    return String.fromCharCode(val);
  else
    return "\\x"+val.toString(16);
}

let buffer = [0xd3, 0xe9, 0x52, 0x18, 0x4c, 0xe7, 0x77, 0xf7, 0xd7];
console.log(buffer.map(encodehex).join(''));

您基本上想在输出中区分可打印和不可打印的 ASCII 字符。

【讨论】:

    【解决方案2】:

    您可以通过 map 方法将缓冲区转换为数组,并将每个项目转换为十六进制字符串。最后用\x(包括前导'\x')将数组加入字符串

    肮脏的例子

    let str = '\\x' +
      [0xd3, 0xe9, 0x52, 0x18, 0x4c, 0xe7, 0x77, 0xf7, 0xd7]
        .map(item => item.toString(16))
        .join('\\x');
    
    console.log(str); // \xd3\xe9\x52\x18\x4c\xe7\x77\xf7\xd7
    

    或者,您可以将 toString('hex') 字符串拆分为两个字符块(数组),然后将其与 \\x(包括前面的 \\x 同上)连接起来,例如:

    let str = 'd3e952184ce777f7d7';
    str = '\\x' + str.match(/.{1,2}/g).join('\\x');
    console.log(str); // \xd3\xe9\x52\x18\x4c\xe7\x77\xf7\xd7
    

    【讨论】:

    • 请注意,与提供的所需输出不匹配。
    • 我忽略了奇怪的字母(R、L、w、...)^^
    猜你喜欢
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 2021-12-11
    • 1970-01-01
    • 2016-03-14
    • 2022-01-18
    相关资源
    最近更新 更多