我想从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>
答案 0 :(得分: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字符。
答案 1 :(得分:0)
您可以通过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