/// <summary> /// Reads the header data and sets the ContentData Property to the correct content. /// </summary> /// <returns>A valid instance of the Headerfile.</returns> protected NdfHeader ReadHeader() { var header = new NdfHeader(); using (var ms = new MemoryStream(FileData)) { ms.Seek(12, SeekOrigin.Begin); var buffer = new byte[4]; ms.Read(buffer, 0, buffer.Length); header.IsCompressedBody = BitConverter.ToInt32(buffer, 0) == 128; ms.Read(buffer, 0, 4); header.FileSizeUncompressedMinusE0 = BitConverter.ToInt32(buffer, 0); ms.Seek(12, SeekOrigin.Current); ms.Read(buffer, 0, 4); header.FileSizeUncompressed = BitConverter.ToInt32(buffer, 0); ms.Seek(4, SeekOrigin.Current); if (header.IsCompressedBody) { ms.Read(buffer, 0, 4); header.UncompressedContentSize = BitConverter.ToInt32(buffer, 0); } buffer = new byte[FileData.Length - ms.Position]; ms.Read(buffer, 0, buffer.Length); if (header.IsCompressedBody) { ContentData = Compressor.Decomp(buffer); } else { ContentData = buffer; } } return(header); }
/// <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); }