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!"); } }