field_encoder.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. class field_encoder:
  2. def __init__(self, target: object) -> None:
  3. self.__target = target
  4. def code(self) -> bytes:
  5. if self.__target.target_type is str:
  6. return self.__code_str(self.__target.get())
  7. if self.__target.target_type is int:
  8. return self.__code_int(self.__target.get())
  9. if self.__target.target_type is float:
  10. return self.__code_float(self.__target.get())
  11. if self.__target.target_type is bytes:
  12. return self.__target.get()
  13. if self.__target.target_type is bool:
  14. return self.__code_bool(self.__target.get())
  15. raise TypeError("Can not encode field, unsupported type.")
  16. def __code_str(self, content: str) -> bytes:
  17. result = content.encode()
  18. difference = self.__target.size - len(result)
  19. if difference > 0:
  20. return result + bytes(difference)
  21. if difference < 0:
  22. return result[0:self.__target.size]
  23. return result
  24. def __code_int(self, content: int) -> bytes:
  25. return content.to_bytes(self.__target.size)
  26. def __code_float(self, content: float) -> bytes:
  27. precission = pow(10, self.float_precission)
  28. as_int = int(content * precission)
  29. result = as_int.to_bytes(self.__target.size)
  30. return result
  31. def __code_bool(self, content: bool) -> bytes:
  32. as_int = int(1 if content else 0)
  33. result = as_int.to_bytes(self.__target.size)
  34. return result