forked from ExodusOSS/bytes
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhex.node.js
More file actions
28 lines (24 loc) · 1.27 KB
/
hex.node.js
File metadata and controls
28 lines (24 loc) · 1.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import { assertUint8 } from './assert.js'
import { typedView } from './array.js'
import { E_HEX } from './fallback/hex.js'
if (Buffer.TYPED_ARRAY_SUPPORT) throw new Error('Unexpected Buffer polyfill')
const { toHex: webHex } = Uint8Array.prototype // Modern engines have this
const denoBug = Buffer.from('ag', 'hex').length > 0
export function toHex(arr) {
assertUint8(arr)
if (arr.length === 0) return ''
if (webHex && arr.toHex === webHex) return arr.toHex()
if (arr.constructor === Buffer && Buffer.isBuffer(arr)) return arr.hexSlice(0, arr.byteLength)
return Buffer.from(arr.buffer, arr.byteOffset, arr.byteLength).hexSlice(0, arr.byteLength)
}
// Unlike Buffer.from(), throws on invalid input
export const fromHex = Uint8Array.fromHex
? (str, format = 'uint8') => typedView(Uint8Array.fromHex(str), format)
: (str, format = 'uint8') => {
if (typeof str !== 'string') throw new TypeError('Input is not a string')
if (str.length % 2 !== 0) throw new SyntaxError(E_HEX)
if (denoBug && /[^\dA-Fa-f]/.test(str)) throw new SyntaxError(E_HEX)
const buf = Buffer.from(str, 'hex') // will stop on first non-hex character, so we can just validate length
if (buf.length * 2 !== str.length) throw new SyntaxError(E_HEX)
return typedView(buf, format)
}