17 static constexpr int TYPE = 0;
20 uint16_t record_length;
21 uint8_t file_type_code;
22 uint32_t total_header_length;
23 uint64_t data_field_length;
25 PrimaryHeader(uint8_t *data)
28 record_length = data[1] << 8 | data[2];
29 file_type_code = data[3];
30 total_header_length = (uint32_t)data[4] << 24 | (uint32_t)data[5] << 16 | (uint32_t)data[6] << 8 | (uint32_t)data[7];
31 data_field_length = (uint64_t)data[8] << 56 | (uint64_t)data[9] << 48 | (uint64_t)data[10] << 40 | (uint64_t)data[11] << 32 | (uint64_t)data[12] << 24 | (uint64_t)data[13] << 16 |
32 (uint64_t)data[14] << 8 | (uint64_t)data[15];
36 struct ImageStructureRecord
38 static constexpr int TYPE = 1;
41 uint16_t record_length;
42 uint8_t bit_per_pixel;
43 uint16_t columns_count;
45 uint8_t compression_flag;
47 ImageStructureRecord(uint8_t *data)
50 record_length = data[1] << 8 | data[2];
51 bit_per_pixel = data[3];
52 columns_count = data[4] << 8 | data[5];
53 lines_count = data[6] << 8 | data[7];
54 compression_flag = data[8];
58 struct ImageNavigationRecord
60 static constexpr int TYPE = 2;
63 uint16_t record_length;
64 std::string projection_name;
65 int32_t column_scaling_factor;
66 int32_t line_scaling_factor;
74 ImageNavigationRecord(uint8_t *data)
77 record_length = data[1] << 8 | data[2];
78 projection_name = std::string((
char *)&data[3], (
char *)&data[3 + 32]);
79 column_scaling_factor = data[35] << 24 | data[36] << 16 | data[37] << 8 | data[38];
80 line_scaling_factor = data[39] << 24 | data[40] << 16 | data[41] << 8 | data[42];
81 column_offset = (int32_t)(data[43] << 24 | data[44] << 16 | data[45] << 8 | data[46]);
82 line_offset = (int32_t)(data[47] << 24 | data[48] << 16 | data[49] << 8 | data[50]);
83 column_scalar = line_scalar = 0.0;
103 struct AnnotationRecord
105 static constexpr int TYPE = 4;
108 uint16_t record_length;
109 std::string annotation_text;
111 AnnotationRecord(uint8_t *data)
114 record_length = data[1] << 8 | data[2];
115 annotation_text.insert(annotation_text.end(), &data[3], &data[record_length]);
119 struct TimeStampRecord
121 static constexpr int TYPE = 5;
124 uint16_t record_length;
126 uint32_t milliseconds_of_day;
130 TimeStampRecord(uint8_t *data)
133 record_length = data[1] << 8 | data[2];
134 uint16_t days = data[3] << 8 | data[4];
135 uint32_t milliseconds_of_day = data[5] << 24 | data[6] << 16 | data[7] << 8 | data[8];
137 timestamp = (days - 4383) * 86400 + milliseconds_of_day;
145 int last_tracked_counter = -1;
147 bool file_in_progress =
false;
148 bool header_parsed =
false;
150 std::map<int, int> custom_flags;
152 std::string filename;
153 int total_header_length;
154 std::map<int, int> all_headers;
155 std::vector<uint8_t> lrit_data;
157 template <
typename T>
160 if constexpr (std::is_same_v<T, PrimaryHeader>)
163 return T(&lrit_data[all_headers[T::TYPE]]);
166 template <
typename T>
169 return all_headers.count(T::TYPE);
172 void parseHeaders(
bool safe =
false);