/// <summary> /// Create a new data block instance from a byte array from data found within the container file. /// </summary> /// <param name="fs">The FileStream instance to use.</param> /// <param name="blockSize">The block size, in bytes.</param> /// <param name="ba">The byte array containing the full block.</param> /// <param name="logging">Instance of LoggingModule to use for logging events.</param> /// <returns>A populated DataBlock object.</returns> public static DataBlock FromBytes(FileStream fs, int blockSize, byte[] ba, LoggingModule logging) { try { if (ba == null || ba.Length < 1) { throw new ArgumentNullException(nameof(ba)); } if (ba.Length < 64) { throw new ArgumentException("Byte array has length less than 64"); } if (blockSize < 4096) { throw new ArgumentOutOfRangeException("Block size must be greater than or equal to 4096"); } if (blockSize % 4096 != 0) { throw new ArgumentOutOfRangeException("Block size must be evenly divisible by 4096"); } if (fs == null) { throw new ArgumentNullException(nameof(fs)); } if (logging != null) { logging.Log(LoggingModule.Severity.Debug, "FromBytes converting " + ba.Length + " bytes to DataBlock"); } DataBlock ret = new DataBlock(fs, blockSize, null, logging); ret.Signature = new byte[4]; ret.Logging = logging; ret.Filestream = fs; byte[] temp; Buffer.BlockCopy(ba, 0, ret.Signature, 0, 4); temp = new byte[4]; Buffer.BlockCopy(ba, 8, temp, 0, 4); ret.Signature = temp; temp = new byte[8]; Buffer.BlockCopy(ba, 4, temp, 0, 8); ret.ParentBlock = BitConverter.ToInt64(temp, 0); temp = new byte[8]; Buffer.BlockCopy(ba, 12, temp, 0, 8); ret.ChildBlock = BitConverter.ToInt32(temp, 0); temp = new byte[4]; Buffer.BlockCopy(ba, 20, temp, 0, 4); ret.DataLength = BitConverter.ToInt32(temp, 0); if (logging != null) { logging.Log(LoggingModule.Severity.Debug, "FromBytes reading data " + ret.DataLength + " bytes from position 64"); } temp = new byte[ret.DataLength]; Buffer.BlockCopy(ba, 64, temp, 0, ret.DataLength); ret.Data = temp; return(ret); } catch (Exception e) { if (logging != null) { logging.LogException("DataBlock", "FromBytes", e); } else { LoggingModule.ConsoleException("DataBlock", "FromBytes", e); } throw; } }