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