Example #1
0
        public IEnumerator <T> GetEnumerator()
        {
            using (var stream = _fileHeader.FileInfo.Open(FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                stream.Seek(_fileHeader.FileHeaderSize, SeekOrigin.Begin);
                while (stream.Position < stream.Length)
                {
                    var blockCount = 0L;
                    var blockSize  = 0L;
                    var blockData  = default(byte[]);
                    var blockSync  = new byte[16];
                    using (var decoder = new BinaryDecoder(stream))
                    {
                        blockCount = decoder.ReadLong();
                        blockSize  = decoder.ReadLong();
                    }
                    blockData = new byte[blockSize];
                    stream.Read(blockData.AsSpan());
                    stream.Read(blockSync.AsSpan());

                    if (!blockSync.SequenceEqual(_fileHeader.Sync))
                    {
                        throw new Exception("Sync marker mismach");
                    }

                    using (var memoryStream = CreateDataStream(blockData))
                        using (var decoder = new BinaryDecoder(memoryStream))
                            for (var i = 0L; i < blockCount; i++)
                            {
                                yield return(_reader.Read(decoder));
                            }
                }
            }
        }