Files
brk/website_next/wallets/xpub/bytes.js
T
2026-06-16 23:37:03 +02:00

93 lines
1.6 KiB
JavaScript

/**
* @param {number} length
*/
export function createBytes(length) {
return new Uint8Array(length);
}
/**
* @param {Uint8Array[]} parts
*/
export function concatBytes(parts) {
const length = parts.reduce((total, part) => total + part.length, 0);
const bytes = createBytes(length);
let offset = 0;
for (const part of parts) {
bytes.set(part, offset);
offset += part.length;
}
return bytes;
}
/**
* @param {Uint8Array} bytes
* @param {number} start
*/
export function readUint32(bytes, start) {
return (
bytes[start] * 0x1000000 +
bytes[start + 1] * 0x10000 +
bytes[start + 2] * 0x100 +
bytes[start + 3]
);
}
/**
* @param {number} value
*/
export function writeUint32(value) {
const bytes = createBytes(4);
bytes[0] = value >>> 24;
bytes[1] = value >>> 16;
bytes[2] = value >>> 8;
bytes[3] = value;
return bytes;
}
/**
* @param {Uint8Array} bytes
*/
export function bytesToBigInt(bytes) {
let value = 0n;
for (const byte of bytes) {
value = (value << 8n) + BigInt(byte);
}
return value;
}
/**
* @param {bigint} value
* @param {number} length
*/
export function bigIntToBytes(value, length) {
const bytes = createBytes(length);
let remaining = value;
for (let i = length - 1; i >= 0; i -= 1) {
bytes[i] = Number(remaining & 0xffn);
remaining >>= 8n;
}
return bytes;
}
/**
* @param {Uint8Array} left
* @param {Uint8Array} right
*/
export function bytesEqual(left, right) {
if (left.length !== right.length) return false;
for (let i = 0; i < left.length; i += 1) {
if (left[i] !== right[i]) return false;
}
return true;
}