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))
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
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')
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")
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)
def _pad_specifier(specifier): _SPECIFIER_SIZE = 16 value = jsstr.to_utf8(specifier) return jsarray.concat(value, jsarray.new_array(_SPECIFIER_SIZE - len(value)))
def str_to_b64(s): return bytes_to_b64(jsstr.to_utf8(s))