예제 #1
0
 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
예제 #2
0
파일: reader.py 프로젝트: 0-vortex/ZeroNet
    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')
예제 #3
0
    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')
예제 #4
0
    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
예제 #5
0
    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)
 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)