Esempio n. 1
0
        private static IEnumerable<Block> GetAllBlocks(string file)
        {
            // try old CotAB file types
            FileStream fsA = new FileStream(file, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);

            var fileA = new BinaryReader(fsA);

            int dataOffset = fileA.ReadInt16() + 2;

            List<HeaderEntry> headers = new List<HeaderEntry>();

            const int headerEntrySize = 9;

            for (int i = 0; i < ((dataOffset - 2) / headerEntrySize); i++)
            {
                HeaderEntry dhe = new HeaderEntry();
                dhe.id = fileA.ReadByte();
                dhe.offset = fileA.ReadInt32();
                dhe.rawSize = fileA.ReadUInt16();
                dhe.compSize = fileA.ReadUInt16();

                //Console.WriteLine(dhe);
                headers.Add(dhe);
            }

            foreach (var dhe in headers)
            {
                byte[] comp = new byte[dhe.compSize];
                if (dhe.rawSize < 0)
                {
                    fileA.BaseStream.Seek(dataOffset + dhe.offset, SeekOrigin.Begin);
                    comp = fileA.ReadBytes(dhe.compSize);

                    yield return new Block(file, dhe.id, comp);
                }
                else
                {
                    byte[] raw = new byte[dhe.rawSize];

                    fileA.BaseStream.Seek(dataOffset + dhe.offset, SeekOrigin.Begin);

                    comp = fileA.ReadBytes(dhe.compSize);

                    Decode(dhe.rawSize, dhe.compSize, raw, comp);

                    yield return new Block(file, dhe.id, raw);
                }
            }

            if (fileA.BaseStream.Position != fileA.BaseStream.Length)
            {
                Console.WriteLine("Wrong Size!");
            }
        }