/// <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);
        }