|
25 | 25 | # files, you must skip any record with a record type that is not |
26 | 26 | # listed above. |
27 | 27 |
|
28 | | -PackedFileRecordHeader = _Structure( |
29 | | - name='PackedFileRecordHeader', |
30 | | - fields=[ |
31 | | - _Field('H', 'recordType', help='Record type plus superceded flag.'), |
32 | | - _Field('h', 'version', |
33 | | - help='Version information depends on the type of record.'), |
34 | | - _Field('l', 'numDataBytes', |
35 | | - help='Number of data bytes in the record following this' |
36 | | - 'record header.'), |
37 | | - ]) |
38 | | - |
39 | 28 | # CR_STR = '\x15' (\r) |
40 | 29 |
|
41 | 30 | PACKEDRECTYPE_MASK = 0x7FFF # Record type = (recordType & PACKEDREC_TYPE_MASK) |
42 | 31 | SUPERCEDED_MASK = 0x8000 # Bit is set if the record is superceded by |
43 | 32 | # a later record in the packed file. |
44 | 33 |
|
45 | 34 |
|
| 35 | +def setup_packed_file_record_header(byte_order='@'): |
| 36 | + record_header = _Structure( |
| 37 | + name='PackedFileRecordHeader', |
| 38 | + fields=[ |
| 39 | + _Field('H', 'recordType', |
| 40 | + help='Record type plus superceded flag.'), |
| 41 | + _Field('h', 'version', |
| 42 | + help='Version information depends on the type of record.'), |
| 43 | + _Field('l', 'numDataBytes', |
| 44 | + help='Number of data bytes in the record following this' |
| 45 | + 'record header.'), |
| 46 | + ], |
| 47 | + byte_order=byte_order) |
| 48 | + record_header.setup() |
| 49 | + return record_header |
| 50 | + |
| 51 | + |
46 | 52 | def load(filename, strict=True, ignore_unknown=True, initial_byte_order=None): |
47 | 53 | """Load a packed experiment file. |
48 | 54 |
|
@@ -77,27 +83,27 @@ def load(filename, strict=True, ignore_unknown=True, initial_byte_order=None): |
77 | 83 | initial_byte_order = '=' |
78 | 84 | try: |
79 | 85 | while True: |
80 | | - PackedFileRecordHeader.byte_order = initial_byte_order |
81 | | - PackedFileRecordHeader.setup() |
82 | | - b = bytes(f.read(PackedFileRecordHeader.size)) |
| 86 | + header_struct = setup_packed_file_record_header( |
| 87 | + byte_order=initial_byte_order) |
| 88 | + b = bytes(f.read(header_struct.size)) |
83 | 89 | if not b: |
84 | 90 | break |
85 | | - if len(b) < PackedFileRecordHeader.size: |
| 91 | + if len(b) < header_struct.size: |
86 | 92 | raise ValueError( |
87 | 93 | ('not enough data for the next record header ({} < {})' |
88 | | - ).format(len(b), PackedFileRecordHeader.size)) |
| 94 | + ).format(len(b), header_struct.size)) |
89 | 95 | logger.debug('reading a new packed experiment file record') |
90 | | - header = PackedFileRecordHeader.unpack_from(b) |
| 96 | + header = header_struct.unpack_from(b) |
91 | 97 | if header['version'] and not byte_order: |
92 | 98 | need_to_reorder = _need_to_reorder_bytes(header['version']) |
93 | 99 | byte_order = initial_byte_order = _byte_order(need_to_reorder) |
94 | 100 | logger.debug( |
95 | 101 | 'get byte order from version: %s (reorder? %s)', |
96 | 102 | byte_order, need_to_reorder) |
97 | 103 | if need_to_reorder: |
98 | | - PackedFileRecordHeader.byte_order = byte_order |
99 | | - PackedFileRecordHeader.setup() |
100 | | - header = PackedFileRecordHeader.unpack_from(b) |
| 104 | + header_struct = setup_packed_file_record_header( |
| 105 | + byte_order=byte_order) |
| 106 | + header = header_struct.unpack_from(b) |
101 | 107 | logger.debug( |
102 | 108 | 'reordered version: %s', header['version']) |
103 | 109 | data = bytes(f.read(header['numDataBytes'])) |
|
0 commit comments