protected byte[] GetCompiledContent(NdfBinary ndf) { var footer = new NdfFooter(); const long headerSize = (long)NdfbinHeaderSize; using (var contentStream = new MemoryStream()) { byte[] buffer = RecompileObj(ndf); footer.AddEntry("OBJE", contentStream.Position + headerSize, buffer.Length); contentStream.Write(buffer, 0, buffer.Length); buffer = RecompileTopo(ndf); footer.AddEntry("TOPO", contentStream.Position + headerSize, buffer.Length); contentStream.Write(buffer, 0, buffer.Length); buffer = RecompileChnk(ndf); footer.AddEntry("CHNK", contentStream.Position + headerSize, buffer.Length); contentStream.Write(buffer, 0, buffer.Length); buffer = RecompileClas(ndf); footer.AddEntry("CLAS", contentStream.Position + headerSize, buffer.Length); contentStream.Write(buffer, 0, buffer.Length); buffer = RecompileProp(ndf); footer.AddEntry("PROP", contentStream.Position + headerSize, buffer.Length); contentStream.Write(buffer, 0, buffer.Length); buffer = RecompileStrTable(ndf.Strings); footer.AddEntry("STRG", contentStream.Position + headerSize, buffer.Length); contentStream.Write(buffer, 0, buffer.Length); buffer = RecompileStrTable(ndf.Trans); footer.AddEntry("TRAN", contentStream.Position + headerSize, buffer.Length); contentStream.Write(buffer, 0, buffer.Length); buffer = RecompileUIntList(ndf.Import); footer.AddEntry("IMPR", contentStream.Position + headerSize, buffer.Length); contentStream.Write(buffer, 0, buffer.Length); buffer = RecompileUIntList(ndf.Export); footer.AddEntry("EXPR", contentStream.Position + headerSize, buffer.Length); contentStream.Write(buffer, 0, buffer.Length); buffer = footer.GetBytes(); footer.Offset = (ulong)contentStream.Position + NdfbinHeaderSize; contentStream.Write(buffer, 0, buffer.Length); ndf.Footer = footer; return contentStream.ToArray(); } }
/// <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; }