コード例 #1
0
        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());
        }
コード例 #2
0
        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();
        }