code: def unpack(self, buff, offset=0):
          
          super().unpack(buff, offset)
  
          self.version = self._version_ihl.value >> 4
          self.ihl = self._version_ihl.value & 15
          self.dscp = self._dscp_ecn.value >> 2
          self.ecn = self._dscp_ecn.value & 3
          self.length = self.length.value
          self.identification = self.identification.value
          self.flags = self._flags_offset.value >> 13
          self.offset = self._flags_offset.value & 8191
          self.ttl = self.ttl.value
          self.protocol = self.protocol.value
          self.checksum = self.checksum.value
          self.source = self.source.value
          self.destination = self.destination.value
  
          if self.ihl > 5:
              options_size = (self.ihl - 5) * 4
              self.data = self.options.value[options_size:]
              self.options = self.options.value[:options_size]
          else:
              self.data = self.options.value
              self.options = b''
docs: Unpack a binary struct into this object's attributes.
  
          Return the values instead of the lib's basic types.
  
          Args:
              buff (bytes): Binary buffer.
              offset (int): Where to begin unpacking.
  
          Raises:
              :exc:`~.exceptions.UnpackException`: If unpack fails.