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); }
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); }
public void WriteStream(FileStream stream) { BinaryHelper.WriteUInt32(stream, offset); BinaryHelper.WriteUInt32(stream, length); }
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); }