private void WriteFileTable(Stream output, IList <IArchiveFileInfo> files) { var crc16 = Crc16.X25; var fileEntries = new List <GfsaFileEntry>(); var fileOffset = 0; foreach (var fileGroup in OrderFiles(files).Cast <GfsaArchiveFileInfo>().GroupBy(x => x.FilePath.GetDirectory().ToRelative() + "/")) { var localGroup = fileGroup.Select(file => { var entry = new GfsaFileEntry { hash = BinaryPrimitives.ReadUInt16BigEndian(crc16.Compute(Encoding.ASCII.GetBytes(file.FilePath.GetName()))), Offset = fileOffset, Size = (int)file.CompressedSize }; fileOffset += (int)((file.CompressedSize + 3) & ~3); return(entry); }); fileEntries.AddRange(localGroup.OrderBy(x => x.hash)); } XfsaSupport.WriteCompressedTableEntries(output, fileEntries); while (output.Position % 4 > 0) { output.WriteByte(0); } }
private IArchiveFileInfo CreateAfi(Stream file, string name, GfsaFileEntry entry) { var method = Level5Compressor.PeekCompressionMethod(file); if (method != Level5CompressionMethod.NoCompression) { return(new GfsaArchiveFileInfo(file, name, entry, Level5Compressor.GetKompressionConfiguration(method), Level5Compressor.PeekDecompressedSize(file))); } return(new GfsaArchiveFileInfo(new SubStream(file, 4, file.Length - 4), name, entry)); }