private uint findPointerPosition(byte[] buffer, uint position)
        {
            var pointerBuffer = new byte[4]; // are the pointers 4 bytes?

            BinaryHelper.WriteUInt32(pointerBuffer, position);

            // assuming the pointer is behind the actual string
            for (var b = 0; b < buffer.Length - pointerBuffer.Length; ++b)
            {
                var match = true;
                for (var r = 0; r < pointerBuffer.Length; ++r)
                {
                    if (buffer[b + r] != pointerBuffer[r])
                    {
                        match = false;
                        break;
                    }
                }

                if (match)
                {
                    return((uint)b);
                }
            }

            return(0);
        }
Example #2
0
 public void WriteStream(FileStream stream)
 {
     BinaryHelper.WriteString(stream, filename, 32);
     BinaryHelper.WriteUInt16(stream, year);
     BinaryHelper.WriteUInt16(stream, month);
     BinaryHelper.WriteUInt16(stream, day);
     BinaryHelper.WriteUInt16(stream, hour);
     BinaryHelper.WriteUInt16(stream, minute);
     BinaryHelper.WriteUInt16(stream, second);
     BinaryHelper.WriteUInt32(stream, fileLength);
 }
Example #3
0
 public void WriteStream(FileStream stream)
 {
     BinaryHelper.WriteUInt32(stream, offset);
     BinaryHelper.WriteUInt32(stream, length);
 }
Example #4
0
        public void WriteStream(FileStream stream)
        {
            var padding_size = 2048;

            // header
            BinaryHelper.WriteString(stream, header, 4);
            BinaryHelper.WriteUInt32(stream, numFiles);

            // table of contents
            for (var i = 0; i < numFiles; ++i)
            {
                var toc_entry = tableOfContents[i];
                toc_entry.WriteStream(stream);
            }

            // padding (table of contents is 512 KB)
            var tableOfContentsSize = padding_size * 256;

            BinaryHelper.WriteAFSPadding(stream, stream.Position, tableOfContentsSize);

            // directory information is at the very end of the table of contents block, past the padding
            stream.Position -= 8;

            BinaryHelper.WriteUInt32(stream, filenameDirectoryOffset);
            BinaryHelper.WriteUInt32(stream, filenameDirectoryLength);

            // data (will need to update ToC entry's from here)
            for (var i = 0; i < numFiles; ++i)
            {
                var toc_entry = tableOfContents[i];
                toc_entry.offset = (uint)stream.Position;

                var afs_file = files[i];
                afs_file.WriteStream(stream);

                // padding
                BinaryHelper.WriteAFSPadding(stream, stream.Position, padding_size);
            }

            filenameDirectoryOffset = (uint)stream.Position;

            // directory
            for (var i = 0; i < numFiles; ++i)
            {
                var dir_entry = directory[i];
                dir_entry.WriteStream(stream);
            }

            filenameDirectoryLength = (uint)(stream.Position - filenameDirectoryOffset);

            // padding
            BinaryHelper.WriteAFSPadding(stream, stream.Position, padding_size);

            // go back and re-write the table of contents, with the updated information
            stream.Position = 8; // header = 4, numfiles = 4

            // table of contents
            for (var i = 0; i < numFiles; ++i)
            {
                var toc_entry = tableOfContents[i];
                toc_entry.WriteStream(stream);
            }

            BinaryHelper.WriteUInt32(stream, filenameDirectoryOffset);
            BinaryHelper.WriteUInt32(stream, filenameDirectoryLength);
        }