/// <summary> /// Reads the header data of the compiled Ndf binary. /// </summary> /// <returns>A valid instance of the Headerfile.</returns> protected NdfHeader ReadHeader(Stream ms) { var header = new NdfHeader(); var buffer = new byte[4]; ms.Read(buffer, 0, buffer.Length); if (BitConverter.ToUInt32(buffer, 0) != 809981253) throw new InvalidDataException("No EUG0 found on top of this file!"); ms.Read(buffer, 0, buffer.Length); if (BitConverter.ToUInt32(buffer, 0) != 0) throw new InvalidDataException("Bytes between EUG0 and CNDF have to be 0"); ms.Read(buffer, 0, buffer.Length); if (BitConverter.ToUInt32(buffer, 0) != 1178881603) throw new InvalidDataException("No CNDF (Compiled NDF)!"); ms.Read(buffer, 0, buffer.Length); header.IsCompressedBody = BitConverter.ToInt32(buffer, 0) == 128; buffer = new byte[8]; ms.Read(buffer, 0, buffer.Length); header.FooterOffset = BitConverter.ToUInt64(buffer, 0); ms.Read(buffer, 0, buffer.Length); header.HeaderSize = BitConverter.ToUInt64(buffer, 0); ms.Read(buffer, 0, buffer.Length); header.FullFileSizeUncomp = BitConverter.ToUInt64(buffer, 0); return header; }
/// <summary> /// Reads the footer data which is the Ndfbin Dictionary. /// </summary> /// <returns></returns> protected NdfFooter ReadFooter(Stream ms, NdfHeader head) { var footer = new NdfFooter(); ms.Seek((long)head.FooterOffset, SeekOrigin.Begin); var dwdBuffer = new byte[4]; var qwdbuffer = new byte[8]; ms.Read(dwdBuffer, 0, dwdBuffer.Length); if (BitConverter.ToUInt32(dwdBuffer, 0) != 809717588) throw new InvalidDataException("Footer doesnt start with TOC0"); ms.Read(dwdBuffer, 0, dwdBuffer.Length); uint footerEntryCount = BitConverter.ToUInt32(dwdBuffer, 0); for (int i = 0; i < footerEntryCount; i++) { var entry = new NdfFooterEntry(); ms.Read(qwdbuffer, 0, qwdbuffer.Length); entry.Name = Encoding.ASCII.GetString(qwdbuffer).TrimEnd('\0'); ms.Read(qwdbuffer, 0, qwdbuffer.Length); entry.Offset = BitConverter.ToInt64(qwdbuffer, 0); ms.Read(qwdbuffer, 0, qwdbuffer.Length); entry.Size = BitConverter.ToInt64(qwdbuffer, 0); footer.Entries.Add(entry); } return footer; }