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