public ImageFileDirectory(FileReader aPefFile) { mPefFile = aPefFile; mEntries = new List <ImageFileDirectoryEntry>(); mEntryCount = mPefFile.ReadUI2(); for (ushort i = 0; i < mEntryCount; i++) { ImageFileDirectoryEntry entry = ImageFileDirectoryEntry.CreateImageFileDirectoryEntry(mPefFile); mEntries.Add(entry); } }
/// <summary> /// Returns a <see cref="ImageFileDirectory" /> initialized from the given byte data. /// </summary> /// <param name="data">The data.</param> /// <param name="offset">The offset into <paramref name="data" />.</param> /// <param name="byteOrder">The byte order of <paramref name="data" />.</param> /// <returns>A <see cref="ImageFileDirectory" /> initialized from the given byte data.</returns> public static ImageFileDirectory FromBytes(byte[] data, uint offset, BitConverterEx.ByteOrder byteOrder) { var ifd = new ImageFileDirectory(); var conv = new BitConverterEx(byteOrder, BitConverterEx.SystemByteOrder); var stripOffsets = new List <uint>(); var stripLengths = new List <uint>(); // Count var fieldcount = conv.ToUInt16(data, offset); // Read fields for (uint i = 0; i < fieldcount; i++) { var fieldoffset = offset + 2 + (12 * i); var field = ImageFileDirectoryEntry.FromBytes(data, fieldoffset, byteOrder); ifd.Fields.Add(field); // Read strip offsets if (field.Tag == 273) { var baselen = field.Data.Length / (int)field.Count; for (uint j = 0; j < field.Count; j++) { var val = new byte[baselen]; Array.Copy(field.Data, j * baselen, val, 0, baselen); var stripOffset = field.Type == 3 ? BitConverter.ToUInt16(val, 0) : BitConverter.ToUInt32(val, 0); stripOffsets.Add(stripOffset); } } // Read strip lengths if (field.Tag == 279) { var baselen = field.Data.Length / (int)field.Count; for (uint j = 0; j < field.Count; j++) { var val = new byte[baselen]; Array.Copy(field.Data, j * baselen, val, 0, baselen); var stripLength = field.Type == 3 ? BitConverter.ToUInt16(val, 0) : BitConverter.ToUInt32(val, 0); stripLengths.Add(stripLength); } } } // Save strips if (stripOffsets.Count != stripLengths.Count) { throw new NotValidTIFFileException(); } for (var i = 0; i < stripOffsets.Count; i++) { ifd.Strips.Add(new TIFFStrip(data, stripOffsets[i], stripLengths[i])); } // Offset to next ifd ifd.NextIFDOffset = conv.ToUInt32(data, offset + 2 + (12 * fieldcount)); return(ifd); }