50 lines
2.1 KiB
JavaScript
50 lines
2.1 KiB
JavaScript
import { bswap32 } from "./fastPforShared";
|
|
/**
|
|
* Decodes big-endian bytes into `out` without allocating the output buffer.
|
|
*
|
|
* This function does not copy `bytes`; it writes decoded words into the provided `out` array.
|
|
* For aligned inputs it may create a temporary typed-array view (`Uint32Array`) over `bytes.buffer`
|
|
* to speed up decoding.
|
|
*
|
|
* If `byteLength` is not a multiple of 4, the final word is padded with zeros.
|
|
*
|
|
* @returns Number of int32 words written.
|
|
* @throws RangeError If `(offset, byteLength)` is out of bounds, or if `out` is too small.
|
|
*/
|
|
export function decodeBigEndianInt32sInto(bytes, offset, byteLength, out) {
|
|
if (offset < 0 || byteLength < 0 || offset + byteLength > bytes.length) {
|
|
throw new RangeError(`decodeBigEndianInt32sInto: out of bounds (offset=${offset}, byteLength=${byteLength}, bytes.length=${bytes.length})`);
|
|
}
|
|
const numCompleteInts = Math.floor(byteLength / 4);
|
|
const hasTrailingBytes = byteLength % 4 !== 0;
|
|
const numInts = hasTrailingBytes ? numCompleteInts + 1 : numCompleteInts;
|
|
if (out.length < numInts) {
|
|
throw new RangeError(`decodeBigEndianInt32sInto: out.length=${out.length} < ${numInts}`);
|
|
}
|
|
if (numCompleteInts > 0) {
|
|
const absoluteOffset = bytes.byteOffset + offset;
|
|
if ((absoluteOffset & 3) === 0) {
|
|
const u32 = new Uint32Array(bytes.buffer, absoluteOffset, numCompleteInts);
|
|
for (let i = 0; i < numCompleteInts; i++) {
|
|
out[i] = bswap32(u32[i]) | 0;
|
|
}
|
|
}
|
|
else {
|
|
for (let i = 0; i < numCompleteInts; i++) {
|
|
const base = offset + i * 4;
|
|
out[i] = (bytes[base] << 24) | (bytes[base + 1] << 16) | (bytes[base + 2] << 8) | bytes[base + 3] | 0;
|
|
}
|
|
}
|
|
}
|
|
if (hasTrailingBytes) {
|
|
const base = offset + numCompleteInts * 4;
|
|
const remaining = byteLength - numCompleteInts * 4;
|
|
let v = 0;
|
|
for (let i = 0; i < remaining; i++) {
|
|
v |= bytes[base + i] << (24 - i * 8);
|
|
}
|
|
out[numCompleteInts] = v | 0;
|
|
}
|
|
return numInts;
|
|
}
|
|
//# sourceMappingURL=bigEndianDecode.js.map
|