uint32 数字与 uint8 数组互相转换

uint32 数字转 uint8 数组

将一个 uint32 的数字的 32 位二进制拆成 4 个 8 位二进制存储:

// 数字转 uint8(四字节)
function numToUint8(num, buffer = new Uint8Array(4), offset = 0) {
  buffer[offset] = (num >> 24) & 0xff
  buffer[offset + 1] = (num >> 16) & 0xff
  buffer[offset + 2] = (num >> 8) & 0xff
  buffer[offset + 3] = (num) & 0xff
  return buffer
}

解释:

  1. & 0xff 是为了取低 8 位二进制。十六进制 ff 就是二进制 11111111。与数字按位与操作时,低 8 位同为 1 的二进制才得以保留,正好可以存储进一个字节的空间。比如:10011100 10010010 & 11111111 => 00000000 10010010。
  2. >> 右位移操作是为了保留高位。比如:11001111 >> 4 => 1100。
  3. 上面两个操作就是为了保留需要的位。比如:(num >> 16) & 0xff 时保留 32 位二进制中的 9~16 位(从左往右)。
  4. 这里之所以解释,是因为太多的文章只有代码,没有说明,这对于不了解位运算的很不友好。

uint8 数组转 uint32 数字

// uint8 转数字
function uint8ToNum(buffer, offset = 0) {
  return (
    (buffer[offset] << 24) + 
    (buffer[offset + 1] << 16) + 
    (buffer[offset + 2] << 8) + 
    (buffer[offset + 3])
  )
}

这两个方法是为了特定场景写的,不算通用方法,但原理是一样的。我这里是高位在左,低位在右。可以换成低位在左,高位在右,这样就可以不限制 uint8 数组的个数了。