UNPKG

js-dicom

Version:

this is js-dicom

125 lines (109 loc) 4.35 kB
import sharedCopy from './sharedCopy.js'; import { readFixedString } from './byteArrayParser.js'; /** * * Internal helper class to assist with parsing. Supports reading from a byte * stream contained in a Uint8Array. Example usage: * * var byteArray = new Uint8Array(32); * var byteStream = new dicomParser.ByteStream(dicomParser.littleEndianByteArrayParser, byteArray); * * */ /** * Constructor for ByteStream objects. * @param byteArrayParser a parser for parsing the byte array * @param byteArray a Uint8Array containing the byte stream * @param position (optional) the position to start reading from. 0 if not specified * @constructor * @throws will throw an error if the byteArrayParser parameter is not present * @throws will throw an error if the byteArray parameter is not present or invalid * @throws will throw an error if the position parameter is not inside the byte array */ export default class ByteStream { constructor (byteArrayParser, byteArray, position) { if (byteArrayParser === undefined) { throw 'dicomParser.ByteStream: missing required parameter \'byteArrayParser\''; } if (byteArray === undefined) { throw 'dicomParser.ByteStream: missing required parameter \'byteArray\''; } if ((byteArray instanceof Uint8Array) === false && (byteArray instanceof Buffer) === false) { throw 'dicomParser.ByteStream: parameter byteArray is not of type Uint8Array or Buffer'; } if (position < 0) { throw 'dicomParser.ByteStream: parameter \'position\' cannot be less than 0'; } if (position >= byteArray.length) { throw 'dicomParser.ByteStream: parameter \'position\' cannot be greater than or equal to \'byteArray\' length'; } this.byteArrayParser = byteArrayParser; this.byteArray = byteArray; this.position = position ? position : 0; this.warnings = []; // array of string warnings encountered while parsing } /** * Safely seeks through the byte stream. Will throw an exception if an attempt * is made to seek outside of the byte array. * @param offset the number of bytes to add to the position * @throws error if seek would cause position to be outside of the byteArray */ seek (offset) { if (this.position + offset < 0) { throw 'dicomParser.ByteStream.prototype.seek: cannot seek to position < 0'; } this.position += offset; } /** * Returns a new ByteStream object from the current position and of the requested number of bytes * @param numBytes the length of the byte array for the ByteStream to contain * @returns {dicomParser.ByteStream} * @throws error if buffer overread would occur */ readByteStream (numBytes) { if (this.position + numBytes > this.byteArray.length) { throw 'dicomParser.ByteStream.prototype.readByteStream: readByteStream - buffer overread'; } var byteArrayView = sharedCopy(this.byteArray, this.position, numBytes); this.position += numBytes; return new ByteStream(this.byteArrayParser, byteArrayView); } /** * * Parses an unsigned int 16 from a byte array and advances * the position by 2 bytes * * @returns {*} the parsed unsigned int 16 * @throws error if buffer overread would occur */ readUint16 () { var result = this.byteArrayParser.readUint16(this.byteArray, this.position); this.position += 2; return result; } /** * Parses an unsigned int 32 from a byte array and advances * the position by 2 bytes * * @returns {*} the parse unsigned int 32 * @throws error if buffer overread would occur */ readUint32 () { var result = this.byteArrayParser.readUint32(this.byteArray, this.position); this.position += 4; return result; } /** * Reads a string of 8-bit characters from an array of bytes and advances * the position by length bytes. A null terminator will end the string * but will not effect advancement of the position. * @param length the maximum number of bytes to parse * @returns {string} the parsed string * @throws error if buffer overread would occur */ readFixedString (length) { var result = readFixedString(this.byteArray, this.position, length); this.position += length; return result; } }