Ejemplo n.º 1
0
    def add_byte(self, value):
        """
        Add an encoded iterateble value as a single byte.

        @param value: the value to be added as a single byte
        """
        if isinstance(value, int):
            self.add_int8(int(value))
        else:
            if isinstance(value, str):
                value = jsstr.to_utf8(value)
            elif not isinstance(
                    value,
                (bytes, bytearray)) and not jsarr.is_uint8_array(value):
                raise ValueError(
                    "value of type {} cannot be added as a single byte".format(
                        type(value)))
            if len(value) != 1:
                raise ValueError(
                    "a single byte has to be accepted, amount of bytes given: {}"
                    .format(len(value)))
            if jsarr.is_uint8_array(value):
                self._data = jsarr.concat(self._data, value)
            else:
                self._data = jsarr.concat(self._data, bytes(value))
Ejemplo n.º 2
0
 def value(self, value):
     """
     Set the NetworkAddress either from another NetworkAddress or
     more likely a string value (representing a Hostname, IPv4- or IPv6 address).
     """
     if value == None:
         self._type = NetworkAddress.Type.HOSTNAME
         self._address = bytes()
     elif isinstance(
             value,
             str) and NetworkAddress.HOSTNAME_REGEXP.match(value) != None:
         if len(value) > NetworkAddress.HOSTNAME_LENGTH_MAX:
             raise ValueError(
                 "the length of a hostname can maximum be {} bytes long".
                 format(NetworkAddress.HOSTNAME_LENGTH_MAX))
         self._type = NetworkAddress.Type.HOSTNAME
         self._address = jsstr.to_utf8(value)
     elif isinstance(value, NetworkAddress):
         self._address = value._address
         self._type = value._type
     else:
         ip = jsipaddr.IPAddress(value)
         self._address = ip.bytes()
         self._type = NetworkAddress.Type.IPV4 if ip.is_ipv4(
         ) else NetworkAddress.Type.IPV6
Ejemplo n.º 3
0
 def _custom_data_setter(self, value):
     if value == None:
         self._data = None
         return
     if isinstance(value, BinaryData):
         value = value.value
     elif isinstance(value, str):
         value = jsstr.to_utf8(value)
     if len(value) > 83:
         raise ValueError(
             "arbitrary data can have a maximum bytes length of 83, {} exceeds this limit".format(len(value)))
     self._data = BinaryData(value=value, strencoding='base64')
Ejemplo n.º 4
0
    def add_array(self, value):
        """
        Encode an iterateble value as an array,
        as specified by the rivbin encoding specification.

        @param value: the iterateble object to be rivbin-encoded as an array
        """
        if isinstance(value, str):
            self._data = jsarr.concat(self._data, jsstr.to_utf8(value))
        elif isinstance(value, (bytes, bytearray)):
            self._data = jsarr.concat(self._data, bytes(value))
        elif jsarr.is_uint8_array(value):
            self._data = jsarr.concat(self._data, value)
        else:
            try:
                for element in value:
                    self.add(element)
            except TypeError:
                raise TypeError("value cannot be encoded as an array")
Ejemplo n.º 5
0
    def add_slice(self,value):
        """
        Add an encoded iterateble value as a slice,
        as specified by the siabin encoding specification.

        @param value: the iterateble object to be siabin-encoded as a slice
        """
        if isinstance(value, str):
            self.add_int(len(value))
            self._data = jsarr.concat(self._data, jsstr.to_utf8(value))
        elif isinstance(value, (bytes, bytearray)):
            self.add_int(len(value))
            self._data = jsarr.concat(self._data, bytes(value))
        elif jsarr.is_uint8_array(value):
            self.add_int(len(value))
            self._data = jsarr.concat(self._data, value)
        else:
            length = 0
            for _ in value:
                length += 1
            self.add_int(length)
            self.add_array(value)
Ejemplo n.º 6
0
 def _pad_specifier(specifier):
     _SPECIFIER_SIZE = 16
     value = jsstr.to_utf8(specifier)
     return jsarray.concat(value,
                           jsarray.new_array(_SPECIFIER_SIZE - len(value)))
Ejemplo n.º 7
0
def str_to_b64(s):
    return bytes_to_b64(jsstr.to_utf8(s))