| 185 | self._encode_segment(buffer, payload, is_self_contained) |
| 186 | |
| 187 | def decode_header(self, buffer): |
| 188 | header_data = read_uint_le(buffer, self.header_length) |
| 189 | |
| 190 | expected_header_crc = read_uint_le(buffer, CRC24_LENGTH) |
| 191 | actual_header_crc = compute_crc24(header_data, self.header_length) |
| 192 | if actual_header_crc != expected_header_crc: |
| 193 | raise CrcException('CRC mismatch on header {:x}. Received {:x}", computed {:x}.'.format( |
| 194 | header_data, expected_header_crc, actual_header_crc)) |
| 195 | |
| 196 | payload_length = header_data & Segment.MAX_PAYLOAD_LENGTH |
| 197 | header_data >>= 17 |
| 198 | |
| 199 | if self.compression: |
| 200 | uncompressed_payload_length = header_data & Segment.MAX_PAYLOAD_LENGTH |
| 201 | header_data >>= 17 |
| 202 | else: |
| 203 | uncompressed_payload_length = -1 |
| 204 | |
| 205 | is_self_contained = (header_data & 1) == 1 |
| 206 | |
| 207 | return SegmentHeader(payload_length, uncompressed_payload_length, is_self_contained) |
| 208 | |
| 209 | def decode(self, buffer, header): |
| 210 | encoded_payload = buffer.read(header.payload_length) |