def _read_extended(self, offset): next_byte = int_from_byte(self._buffer[offset]) type_num = next_byte + 7 if type_num < 7: raise InvalidDatabaseError( 'Something went horribly wrong in the decoder. An ' 'extended type resolved to a type number < 8 ' '({type})'.format(type=type_num)) return type_num, offset + 1
def _find_address_in_tree(self, ip_address): packed = ip_address.packed bit_count = len(packed) * 8 node = self._start_node(bit_count) for i in range(bit_count): if node >= self._metadata.node_count: break bit = 1 & (int_from_byte(packed[i >> 3]) >> 7 - (i % 8)) node = self._read_node(node, bit) if node == self._metadata.node_count: # Record is empty return 0 elif node > self._metadata.node_count: return node raise InvalidDatabaseError('Invalid node in search tree')
def _size_from_ctrl_byte(self, ctrl_byte, offset, type_num): size = ctrl_byte & 0x1f if type_num == 1 or size < 29: return size, offset if size == 29: size = 29 + int_from_byte(self._buffer[offset]) return size, offset + 1 # Using unpack rather than int_from_bytes as it is faster # here and below. if size == 30: new_offset = offset + 2 size_bytes = self._buffer[offset:new_offset] size = 285 + struct.unpack(b'!H', size_bytes)[0] return size, new_offset new_offset = offset + 3 size_bytes = self._buffer[offset:new_offset] size = struct.unpack(b'!I', b'\x00' + size_bytes)[0] + 65821 return size, new_offset
def decode(self, offset): """Decode a section of the data section starting at offset Arguments: offset -- the location of the data structure to decode """ new_offset = offset + 1 ctrl_byte = int_from_byte(self._buffer[offset]) type_num = ctrl_byte >> 5 # Extended type if not type_num: (type_num, new_offset) = self._read_extended(new_offset) try: decoder = self._type_decoder[type_num] except KeyError: raise InvalidDatabaseError('Unexpected type number ({type}) ' 'encountered'.format(type=type_num)) (size, new_offset) = self._size_from_ctrl_byte(ctrl_byte, new_offset, type_num) return decoder(self, size, new_offset)
def test_byte(self): # Python 2.6 doesn't support dictionary comprehension b = dict((byte_from_int(0xc0 ^ int_from_byte(k[0])) + k[1:], v.encode('utf-8')) for k, v in self.strings.items()) self.validate_type_decoding('byte', b)