IntHeaderProtobufFile.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #!/usr/bin/env python
  2. #encoding:utf-8
  3. import string
  4. import struct
  5. from google.protobuf import message as _message
  6. class Reader(object):
  7. def __init__(self, protobufClass, file):
  8. self.protobufClass = protobufClass
  9. self.file = file
  10. self.f = open(self.file, "rb")
  11. def __enter__(self):
  12. pass
  13. def __iter__(self):
  14. return self
  15. def next(self):
  16. header = self.f.read(4)
  17. if len(header) < 4:
  18. self.__exit__(None, None, None)
  19. raise StopIteration()
  20. length = struct.unpack('>i', header)
  21. bytes = self.f.read(length[0])
  22. protoObj = self.protobufClass()
  23. protoObj.ParseFromString(bytes)
  24. return protoObj
  25. def __next__(self):
  26. self.next()
  27. def __exit__(self, exc_type, exc_val, exc_tb):
  28. self.f.close()
  29. class Writer(object):
  30. def __init__(self, file):
  31. self.file = file
  32. self.f = open(self.file, "wb")
  33. def __enter__(self):
  34. pass
  35. def write(self, message):
  36. if isinstance(message, str):
  37. length = len(message)
  38. self.f.write(struct.pack(">i", length))
  39. self.f.write(message)
  40. return
  41. if isinstance(message, _message.Message):
  42. bytes = message.SerializeToString()
  43. length = len(bytes)
  44. self.f.write(struct.pack(">i", length))
  45. self.f.write(bytes)
  46. return
  47. def flush(self):
  48. self.f.flush()
  49. def close(self):
  50. self.f.close()
  51. def isclosed(self):
  52. return self.f.closed
  53. closed = property(isclosed)
  54. def __exit__(self, exc_type, exc_val, exc_tb):
  55. self.close()
  56. if __name__ == "__main__":
  57. pass