136 lines
3.1 KiB
JavaScript
Raw Normal View History

import * as utf8 from 'utf8-codec'
export const isU8Arr = input => input instanceof Uint8Array
export function bytelength (input) {
return typeof input === 'string' ? utf8.encodingLength(input) : input.byteLength
}
export function from (input) {
if (input instanceof Uint8Array) {
return input
}
if (Array.isArray(input)) {
return new Uint8Array(input)
}
return utf8.encode(input)
}
export function write (arr, str, start) {
if (typeof str !== 'string') {
throw new Error('unknown input type')
}
utf8.encode(str, arr, start)
return utf8.encode.bytes
}
const hexNum = {}
const numHex = new Array(0xff)
for (let b0 = 0; b0 <= 0xf; b0 += 1) {
const b0L = b0.toString(16)
const b0U = b0L.toUpperCase()
for (let b1 = 0; b1 <= 0xf; b1 += 1) {
const b1L = b1.toString(16)
const b1U = b1L.toUpperCase()
const num = b0 << 4 | b1
const hex = `${b0L}${b1L}`
numHex[num] = hex
hexNum[hex] = num
hexNum[`${b0U}${b1L}`] = num
hexNum[`${b0L}${b1U}`] = num
hexNum[`${b0U}${b1U}`] = num
}
}
export function toHex (buf, start, end) {
let result = ''
for (let offset = start; offset < end;) {
const num = buf[offset++]
result += numHex[num]
}
return result
}
export function hexLength (string) {
return string.length >>> 1
}
export function writeHex (buf, string, offset, end) {
let i = 0
while (offset < end) {
const hex = string.substr(i, 2)
const num = hexNum[hex]
if (num === undefined) return
buf[offset++] = num
i += 2
}
return buf
}
const P_24 = Math.pow(2, 24)
const P_16 = Math.pow(2, 16)
const P_8 = Math.pow(2, 8)
export const readUInt32BE = (buf, offset) => buf[offset] * P_24 +
buf[offset + 1] * P_16 +
buf[offset + 2] * P_8 +
buf[offset + 3]
export const readUInt16BE = (buf, offset) => (buf[offset] << 8) | buf[offset + 1]
export const writeUInt32BE = (buf, value, offset) => {
value = +value
buf[offset + 3] = value
value = value >>> 8
buf[offset + 2] = value
value = value >>> 8
buf[offset + 1] = value
value = value >>> 8
buf[offset] = value
return offset + 4
}
export const writeUInt16BE = (buf, value, offset) => {
buf[offset] = value >> 8
buf[offset + 1] = value & 0xFF
return offset + 2
}
export function copy (source, target, targetStart, sourceStart, sourceEnd) {
if (targetStart < 0) {
sourceStart -= targetStart
targetStart = 0
}
if (sourceStart < 0) {
sourceStart = 0
}
if (sourceEnd < 0) {
return new Uint8Array(0)
}
if (targetStart >= target.length || sourceStart >= sourceEnd) {
return 0
}
return _copyActual(source, target, targetStart, sourceStart, sourceEnd)
}
function _copyActual (source, target, targetStart, sourceStart, sourceEnd) {
if (sourceEnd - sourceStart > target.length - targetStart) {
sourceEnd = sourceStart + target.length - targetStart
}
let nb = sourceEnd - sourceStart
const sourceLen = source.length - sourceStart
if (nb > sourceLen) {
nb = sourceLen
}
if (sourceStart !== 0 || sourceEnd < source.length) {
source = new Uint8Array(source.buffer, source.byteOffset + sourceStart, nb)
}
target.set(source, targetStart)
return nb
}