Пример #1
0
        public static Record Parse(byte[] bytes, int offset = 0)
        {
            var header = RecordHeader.Parse(bytes, offset);
            var fields = (header.flags & RecordHeader.RecordFlags.Compressed) == RecordHeader.RecordFlags.Compressed ?
                         new List <Field>() :
                         Field.ParseAll(bytes, offset + RecordHeader.HeaderSize, (int)header.DataSize);

            return(new Record()
            {
                Fields = fields, Header = header
            });
        }
Пример #2
0
        public static async Task <ScannedHeaders> ScanHeaders(Stream streamToScan, long bytesToScan)
        {
            var scannedHeaders = new ScannedHeaders()
            {
                Groups  = new List <ScannedHeaders.ScanResult <GroupHeader> >(),
                Records = new List <ScannedHeaders.ScanResult <RecordHeader> >(),
            };
            long endIndex = streamToScan.Position + bytesToScan;

            // Re-use the same allocation for each header, as a
            // record header and group header are the same size (24 bytes)
            byte[] headerBytes = new byte[24];
            while (streamToScan.Position < endIndex)
            {
                await streamToScan.ReadAsync(headerBytes, 0, headerBytes.Length);

                string type = Encoding.UTF8.GetString(headerBytes, 0, 4);

                switch (type)
                {
                case "GRUP":
                    var groupHeader   = GroupHeader.Parse(headerBytes);
                    var scannedHeader = new ScannedHeaders.ScanResult <GroupHeader>(streamToScan.Position - 24, groupHeader);
                    scannedHeaders.Groups.Add(scannedHeader);
                    // Skip past the records in the group
                    streamToScan.Seek(groupHeader.DataSize, SeekOrigin.Current);
                    break;

                default:
                    var recordHeader  = RecordHeader.Parse(headerBytes);
                    var scannedRecord = new ScannedHeaders.ScanResult <RecordHeader>(streamToScan.Position - 24, recordHeader);
                    scannedHeaders.Records.Add(scannedRecord);
                    // SKip past the fields in the record
                    streamToScan.Seek(recordHeader.DataSize, SeekOrigin.Current);
                    break;
                }
            }
            return(scannedHeaders);
        }