modern-netcdf
Version:
Modern NetCDF file reader and utilities
77 lines (72 loc) • 2.09 kB
JavaScript
const { str2num, num2bytes, readType } = require('./types');
const { types } = require('./types');
function nonRecord(buffer, variable) {
const type = str2num(variable.type);
const size = variable.size / num2bytes(type);
let data;
switch (type) {
case types.BYTE:
data = new Uint8Array(size);
break;
case types.SHORT:
data = new Int16Array(size);
break;
case types.INT:
data = new Int32Array(size);
break;
case types.FLOAT:
data = new Float32Array(size);
break;
case types.DOUBLE:
data = new Float64Array(size);
break;
default:
throw new Error(`Unsupported type for TypedArray: ${variable.type}`);
}
for (let i = 0; i < size; i++) {
data[i] = readType(buffer, type, 1);
}
return data;
}
function record(buffer, variable, recordDimension) {
const type = str2num(variable.type);
const width = variable.size ? variable.size / num2bytes(type) : 1;
const recordCount = recordDimension.length;
const totalElements = recordCount * width;
let data;
switch (type) {
case types.BYTE:
data = new Uint8Array(totalElements);
break;
case types.SHORT:
data = new Int16Array(totalElements);
break;
case types.INT:
data = new Int32Array(totalElements);
break;
case types.FLOAT:
data = new Float32Array(totalElements);
break;
case types.DOUBLE:
data = new Float64Array(totalElements);
break;
default:
throw new Error(`Unsupported type for TypedArray: ${variable.type}`);
}
const step = recordDimension.recordStep;
if (step === undefined) throw new Error('recordDimension.recordStep is undefined');
for (let r = 0; r < recordCount; r++) {
const currentOffset = buffer.offset;
const values = readType(buffer, type, width);
if (width === 1) {
data[r] = values;
} else {
for (let j = 0; j < width; j++) {
data[r * width + j] = values[j];
}
}
buffer.seek(currentOffset + step);
}
return data;
}
module.exports = { nonRecord, record };