107 lines
3.5 KiB
JavaScript
107 lines
3.5 KiB
JavaScript
export function encodeFloatsLE(values) {
|
|
const buffer = new Uint8Array(values.length * 4);
|
|
const view = new DataView(buffer.buffer);
|
|
for (let i = 0; i < values.length; i++) {
|
|
view.setFloat32(i * 4, values[i], true);
|
|
}
|
|
return buffer;
|
|
}
|
|
export function encodeDoubleLE(values) {
|
|
const buffer = new Uint8Array(values.length * Float64Array.BYTES_PER_ELEMENT);
|
|
const view = new DataView(buffer.buffer);
|
|
for (let i = 0; i < values.length; i++) {
|
|
view.setFloat64(i * Float64Array.BYTES_PER_ELEMENT, values[i], true);
|
|
}
|
|
return buffer;
|
|
}
|
|
export function encodeBooleanRle(values) {
|
|
// Pack booleans into bytes (8 booleans per byte)
|
|
const numBytes = Math.ceil(values.length / 8);
|
|
const packed = new Uint8Array(numBytes);
|
|
for (let i = 0; i < values.length; i++) {
|
|
if (values[i]) {
|
|
const byteIndex = Math.floor(i / 8);
|
|
const bitIndex = i % 8;
|
|
packed[byteIndex] |= 1 << bitIndex;
|
|
}
|
|
}
|
|
const result = new Uint8Array(1 + numBytes);
|
|
result[0] = 256 - numBytes;
|
|
result.set(packed, 1);
|
|
return result;
|
|
}
|
|
export function encodeByteRle(values) {
|
|
const result = [];
|
|
let i = 0;
|
|
while (i < values.length) {
|
|
const currentByte = values[i];
|
|
let runLength = 1;
|
|
while (i + runLength < values.length && values[i + runLength] === currentByte && runLength < 131) {
|
|
runLength++;
|
|
}
|
|
if (runLength >= 3) {
|
|
const header = runLength - 3;
|
|
result.push(Math.min(header, 0x7f));
|
|
result.push(currentByte);
|
|
i += runLength;
|
|
}
|
|
else {
|
|
const literalStart = i;
|
|
while (i < values.length) {
|
|
let nextRunLength = 1;
|
|
if (i + 1 < values.length) {
|
|
while (i + nextRunLength < values.length &&
|
|
values[i + nextRunLength] === values[i] &&
|
|
nextRunLength < 3) {
|
|
nextRunLength++;
|
|
}
|
|
}
|
|
if (nextRunLength >= 3) {
|
|
break;
|
|
}
|
|
i++;
|
|
if (i - literalStart >= 128) {
|
|
break;
|
|
}
|
|
}
|
|
const numLiterals = i - literalStart;
|
|
const header = 256 - numLiterals;
|
|
result.push(header);
|
|
for (let j = literalStart; j < i; j++) {
|
|
result.push(values[j]);
|
|
}
|
|
}
|
|
}
|
|
return new Uint8Array(result);
|
|
}
|
|
export function encodeStrings(strings) {
|
|
const encoder = new TextEncoder();
|
|
const encoded = strings.map((s) => encoder.encode(s));
|
|
const totalLength = encoded.reduce((sum, arr) => sum + arr.length, 0);
|
|
const result = new Uint8Array(totalLength);
|
|
let offset = 0;
|
|
for (const arr of encoded) {
|
|
result.set(arr, offset);
|
|
offset += arr.length;
|
|
}
|
|
return result;
|
|
}
|
|
export function createStringLengths(strings) {
|
|
const lengths = new Uint32Array(strings.length);
|
|
const encoder = new TextEncoder();
|
|
for (let i = 0; i < strings.length; i++) {
|
|
lengths[i] = encoder.encode(strings[i]).length;
|
|
}
|
|
return lengths;
|
|
}
|
|
export function concatenateBuffers(...buffers) {
|
|
const totalLength = buffers.reduce((sum, buf) => sum + buf.length, 0);
|
|
const result = new Uint8Array(totalLength);
|
|
let offset = 0;
|
|
for (const buffer of buffers) {
|
|
result.set(buffer, offset);
|
|
offset += buffer.length;
|
|
}
|
|
return result;
|
|
}
|
|
//# sourceMappingURL=encodingUtils.js.map
|