/// <summary> /// Creates a new Chunk from given byte data /// </summary> /// <param name="inputData">The data to read from</param> /// <param name="offset">The offset in the byte array to start reading from</param> /// <returns>The new Chunk</returns> /// <exception cref="EndOfDataException">Unexpected end of Data</exception> /// <exception cref="InvalidChunkException">If Chunk name is not valid or the read chunk length is negative</exception> public static BaseChunk FromData(byte[] inputData, int offset, MSH owner) { if (inputData.Length < 8 || offset + 8 > inputData.Length) { Log.Add("Unexpected end of Data!", LogType.Error); throw new EndOfDataException("Unexpected end of Data!"); } BaseChunk chunk = new BaseChunk(owner); //every chunk starts with a chunk name (4 bytes) chunk.ChunkName = inputData.SubArray(offset, 4).GetString(); offset += 4; //and an Int32 defining the length of the chunk (in bytes) int length = BitConverter.ToInt32(inputData, offset); offset += 4; if (!Regex.Match(chunk.ChunkName, ValidChunkRegEx).Success) { Log.Add(chunk.ChunkName + " is not a valid Chunk Name!", LogType.Error); throw new InvalidChunkException(chunk.ChunkName + " is not a valid Chunk Name!"); } if (length < 0) { Log.Add(length + " is not a valid Chunk Length!", LogType.Error); throw new InvalidChunkException(length + " is not a valid Chunk Length!"); } if (offset + length > inputData.Length) { Log.Add("Unexpected end of Data!", LogType.Error); throw new EndOfDataException("Unexpected end of Data!"); } //create own data chunk.data.AddRange(inputData.SubArray(offset, length)); chunk.ResetPosition(); Log.Add("Valid Chunk " + chunk.ChunkName + " found of length " + chunk.data.Count, LogType.Info); return(chunk); }
/// <summary> /// Creates a new Chunk from given Stream /// </summary> /// <param name="stream">The Stream to read from</param> /// <returns>The new Chunk</returns> /// <exception cref="EndOfDataException">Unexpected end of Data</exception> /// <exception cref="InvalidChunkException">If Chunk name is not valid or the read chunk length is negative</exception> public static BaseChunk FromData(ChunkStream stream, MSH owner) { BaseChunk chunk = new BaseChunk(owner); //every chunk starts with a chunk name (4 bytes) chunk.ChunkName = stream.ReadString(4); //and an Int32 defining the length of the chunk (in bytes) int length = stream.ReadInt32(); if (!Regex.Match(chunk.ChunkName, ValidChunkRegEx).Success) { Log.Add(chunk.ChunkName + " is not a valid Chunk Name!", LogType.Error); throw new InvalidChunkException(chunk.ChunkName + " is not a valid Chunk Name!"); } if (length < 0) { Log.Add(length + " is not a valid Chunk Length!", LogType.Error); throw new InvalidChunkException(length + " is not a valid Chunk Length!"); } //read all the data byte[] buffer = new byte[length]; try { stream.Read(buffer, 0, length); chunk.data.AddRange(buffer); } catch (ArgumentOutOfRangeException ex) { Log.Add("Unexpected end of Data!", LogType.Error); throw new EndOfDataException("Unexpected end of Data!", ex); } chunk.ResetPosition(); return(chunk); }