将Uint8Array转换为node.js中的十六进制字符串等效项

6 string-conversion node.js

我正在使用node.js v4.5.假设我有这个Uint8Array变量.

var uint8 = new Uint8Array(4);
uint8[0] = 0x1f;
uint8[1] = 0x2f;
uint8[2] = 0x3f;
uint8[3] = 0x4f;
Run Code Online (Sandbox Code Playgroud)

这个数组可以是任何长度,但我们假设长度是4.

我想有一个函数,转换uint8为十六进制字符串等效.

var hex_string = convertUint8_to_hexStr(uint8);
//hex_string becomes "1f2f3f4f"
Run Code Online (Sandbox Code Playgroud)

rob*_*lep 20

您可以使用Buffer.from()并随后使用toString('hex'):

let hex = Buffer.from(uint8).toString('hex');
Run Code Online (Sandbox Code Playgroud)

  • 对于 Node.js 用例来说,这是一个很好的答案,但它与 Deno 或浏览器不兼容。 (2认同)

Moo*_*ang 6

Buffer.from有多个覆盖。

如果直接用你的方法调用它uint8,它会不必要地复制其内容,因为它选择Buffer.from( <Buffer|Uint8Array> )版本。

您应该调用Buffer.from( arrayBuffer[, byteOffset[, length]] )不复制而仅创建缓冲区视图的版本。

let hex = Buffer.from(uint8.buffer,uint8.byteOffset,uint8.byteLength).toString('hex');
Run Code Online (Sandbox Code Playgroud)


Tom*_*Rup 5

另一个解决方案reduce

uint8.reduce(function(memo, i) {
    return memo + ('0' + i.toString(16)).slice(-2); //padd with leading 0 if <16
}, '');
Run Code Online (Sandbox Code Playgroud)

mapjoin

uint8.map(function(i) {
    return ('0' + i.toString(16)).slice(-2);
}).join('');
Run Code Online (Sandbox Code Playgroud)

  • 当十进制值小于16时,这不能正确填充。这是固定版本`uint8.reduce(function(memo,i){return memo +(“ 0” + i.toString(16))。slice(-2);},'');` (3认同)
  • 第二种方法仅适用于数组,但不适用于 Uint8Array,因为映射函数尝试将字符串写入数组(对于 Uint8Array,它被转换为数字,并且当十六进制数字中有字母时计算结果为零)。解决方法是使用 Array.from(uint8) 而不是 uint8。 (3认同)
  • 稍微现代化:`uint8.reduce((t, x) =&gt; t + x.toString(16).padStart(2, '0'), '')` (2认同)