modern-netcdf
Version:
Modern NetCDF file reader and utilities
108 lines (101 loc) • 2.33 kB
JavaScript
const types = {
BYTE: 1,
CHAR: 2,
SHORT: 3,
INT: 4,
FLOAT: 5,
DOUBLE: 6,
};
function num2str(type) {
switch (Number(type)) {
case types.BYTE:
return 'byte';
case types.CHAR:
return 'char';
case types.SHORT:
return 'short';
case types.INT:
return 'int';
case types.FLOAT:
return 'float';
case types.DOUBLE:
return 'double';
default:
return 'undefined';
}
}
function str2num(type) {
switch (String(type)) {
case 'byte':
return types.BYTE;
case 'char':
return types.CHAR;
case 'short':
return types.SHORT;
case 'int':
return types.INT;
case 'float':
return types.FLOAT;
case 'double':
return types.DOUBLE;
default:
return -1;
}
}
function num2bytes(type) {
switch (Number(type)) {
case types.BYTE:
case types.CHAR:
return 1;
case types.SHORT:
return 2;
case types.INT:
case types.FLOAT:
return 4;
case types.DOUBLE:
return 8;
default:
return -1;
}
}
function readNumber(size, bufferReader) {
if (size !== 1) {
const numbers = new Array(size);
for (let i = 0; i < size; i++) {
numbers[i] = bufferReader();
}
return numbers;
}
return bufferReader();
}
function readType(buffer, type, size) {
switch (type) {
case types.BYTE:
return size === 1 ? buffer.readByte() : Array.from(buffer.readBytes(size));
case types.CHAR:
return trimNull(buffer.readChars(size));
case types.SHORT:
return size === 1 ? buffer.readInt16() : readNumber(size, buffer.readInt16.bind(buffer));
case types.INT:
return size === 1 ? buffer.readInt32() : readNumber(size, buffer.readInt32.bind(buffer));
case types.FLOAT:
return size === 1 ? buffer.readFloat32() : readNumber(size, buffer.readFloat32.bind(buffer));
case types.DOUBLE:
return size === 1 ? buffer.readFloat64() : readNumber(size, buffer.readFloat64.bind(buffer));
default:
throw new Error(`Non valid type ${type}`);
}
}
function trimNull(value) {
if (typeof value === 'string' && value.charCodeAt(value.length - 1) === 0) {
return value.substring(0, value.length - 1);
}
return value;
}
module.exports = {
types,
num2str,
str2num,
num2bytes,
readType,
};