28

I am using node.js v4.5. Suppose I have this Uint8Array variable.

var uint8 = new Uint8Array(4);
uint8[0] = 0x1f;
uint8[1] = 0x2f;
uint8[2] = 0x3f;
uint8[3] = 0x4f;

This array can be of any length but let's assume the length is 4.

I would like to have a function that that converts uint8 into the hex string equivalent.

var hex_string = convertUint8_to_hexStr(uint8);
//hex_string becomes "1f2f3f4f"

4 Answers4

64

You can use Buffer.from() and subsequently use toString('hex'):

let hex = Buffer.from(uint8).toString('hex');
robertklep
  • 198,204
  • 35
  • 394
  • 381
15

Another solution:

Base function to convert int8 to hex:

// padd with leading 0 if <16
function i2hex(i) {
  return ('0' + i.toString(16)).slice(-2);
}

reduce:

uint8.reduce(function(memo, i) {return memo + i2hex(i)}, '');

Or map and join:

Array.from(uint8).map(i2hex).join('');
Tomasz Jakub Rup
  • 10,502
  • 7
  • 48
  • 49
  • 4
    This does not padd correctly when the decimal value is <16. Here's a fixed version `uint8.reduce(function(memo, i) { return memo + ("0"+i.toString(16)).slice(-2); }, '');` – tintin May 22 '17 at 10:04
  • 3
    Second method works only for an Array but not Uint8Array, as the map function tries to write a string to the array (for Uint8Array it is casted to a number and evaluates to zero when there is a letter in the hex number). Workaround is to use Array.from(uint8) instead of uint8. – Motla Feb 09 '20 at 17:47
  • 2
    Slight modernization: `uint8.reduce((t, x) => t + x.toString(16).padStart(2, '0'), '')` – Joe Hildebrand Sep 18 '22 at 17:42
6

Buffer.from has multiple overrides.

If it is called with your uint8 directly, it unnecessarily copies its content because it selects Buffer.from( <Buffer|Uint8Array> ) version.

You should call Buffer.from( arrayBuffer[, byteOffset[, length]] ) version which does not copy and just creates a view of the buffer.

let hex = Buffer.from(uint8.buffer,uint8.byteOffset,uint8.byteLength).toString('hex');
  • Relevant documentation here: https://nodejs.org/api/buffer.html#static-method-bufferfromarraybuffer-byteoffset-length – geon Aug 30 '22 at 06:45
1

Buffer is nodeJS specific.

This is a version that works everywhere:

const uint8 = new Uint8Array(4);
uint8[0] = 0x1f;
uint8[1] = 0x2f;
uint8[2] = 0x3f;
uint8[3] = 0x4f;

function convertUint8_to_hexStr(uint8) {
  Array.from(uint8)
    .map((i) => i.toString(16).padStart(2, '0'))
    .join('');
}

convertUint8_to_hexStr(uint8);
Uriel
  • 121
  • 1
  • 1
  • 8