Example #1
0
        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();
            }
        }
Example #2
0
        /// <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;
        }