code: def table_driven(self, in_data):
          
          # If the input data is a string, convert to bytes.
          if isinstance(in_data, str):
              in_data = [ord(c) for c in in_data]
  
          tbl = self.gen_table()
  
          register = self.DirectInit << self.CrcShift
          if not self.ReflectIn:
              for octet in in_data:
                  tblidx = ((register >> (self.Width - self.TableIdxWidth + self.CrcShift)) ^ octet) & 0xff
                  register = ((register << (self.TableIdxWidth - self.CrcShift)) ^ tbl[tblidx]) & (self.Mask << self.CrcShift)
              register = register >> self.CrcShift
          else:
              register = self.reflect(register, self.Width + self.CrcShift) << self.CrcShift
              for octet in in_data:
                  tblidx = ((register >> self.CrcShift) ^ octet) & 0xff
                  register = ((register >> self.TableIdxWidth) ^ tbl[tblidx]) & (self.Mask << self.CrcShift)
              register = self.reflect(register, self.Width + self.CrcShift) & self.Mask
  
          if self.ReflectOut:
              register = self.reflect(register, self.Width)
          return register ^ self.XorOut
docs: The Standard table_driven CRC algorithm.