public static Entry[] Open(Stream Packget) { Stream HeaderData = new MemoryStream(); Packget.Seek(0xC, SeekOrigin.Begin); Stream Decryptor = new CryptoStream(Packget, true); Decryptor.CopyTo(HeaderData); HeaderData.Position = 0; BinHeader Header = new BinHeader(); StructReader Reader = new StructReader(HeaderData); Reader.ReadStruct(ref Header); return((from x in Header.Entries select new Entry() { FileName = Packget.PeekCString(x.NOffset + (Header.FileCount * 12) + 0x14), Content = new VirtStream(Packget, x.DOffset, x.Length) }).ToArray()); }
public static void Save(Entry[] Files, Stream Output) { const string Signature = "ESC-ARC2"; Output.WriteString(Signature); byte[] Key = new byte[4]; new Random().NextBytes(Key); Output.Write(Key, 0, Key.Length); MemoryStream NamesTbl = new MemoryStream(); BinHeader Header = new BinHeader() { Entries = new BinEntry[Files.Length] }; Stream[] Compressed = new Stream[Files.Length]; uint DSize = 0; for (int i = 0; i < Files.Length; i++) { #if COMPRESS Compressed[i] = new MemoryStream(FakeCompress(Files[i].Content.ToArray())); #else Compressed[i] = new MemoryStream(Files[i].Content.ToArray()); #endif Files[i].Content.Close(); Header.Entries[i] = new BinEntry() { DOffset = DSize, NOffset = (uint)NamesTbl.Length, Length = (uint)Compressed[i].Length }; DSize += (uint)Compressed[i].Length; NamesTbl.WriteCString(Files[i].FileName); } NamesTbl.Position = 0; Header.NameTblLen = (uint)NamesTbl.Length; uint HeaderLen = ((uint)Header.Entries.Length * 12) + 0x14; for (int i = 0; i < Files.Length; i++) { Header.Entries[i].DOffset += Header.NameTblLen + HeaderLen; } byte[] HeaderData = Tools.BuildStruct(ref Header); CryptoStream Encryptor = new CryptoStream(Output, false, Key.GetUInt32(0)); Encryptor.Write(HeaderData, 0, HeaderData.Length); Encryptor.Flush(); NamesTbl.CopyTo(Output); for (int i = 0; i < Files.Length; i++) { Compressed[i].CopyTo(Output); Compressed[i].Close(); } NamesTbl?.Close(); Encryptor?.Close(); Output?.Close(); }