You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
2.1 KiB

  1. using System;
  2. using System.IO;
  3. namespace JT809.Protocol.ProtocolPacket
  4. {
  5. public abstract class BufferedEntityBase : IBuffered, IBuffer
  6. {
  7. public byte[] Buffer { get; protected set; }
  8. public virtual byte[] ToBuffer()
  9. {
  10. using (var stream = new MemoryStream())
  11. {
  12. var writer = new BinaryWriter(stream);
  13. OnWriteToBuffer(writer);
  14. var reader = new BinaryReader(stream);
  15. stream.Seek(0, SeekOrigin.Begin);
  16. Buffer = reader.ReadBytes((int)stream.Length);//stream.GetBuffer();
  17. stream.Close();
  18. }
  19. return Buffer;
  20. }
  21. protected BufferedEntityBase(params object[] properties)
  22. {
  23. InitializeProperties(properties, 0);
  24. ToBuffer();
  25. }
  26. protected BufferedEntityBase(byte[] buffer)
  27. {
  28. Buffer = buffer;
  29. InitializePropertiesFromBuffer();
  30. }
  31. public static byte[] SetMatchBytes(byte[] bufferIn, int lengthMatch, byte mask = 0X00)
  32. {
  33. if (bufferIn.Length != lengthMatch)
  34. {
  35. var tempBuffer = new byte[lengthMatch];
  36. Array.ForEach(tempBuffer, b => b = mask);//TODO : Maybe mask error
  37. var copyLength = bufferIn.Length > lengthMatch ? lengthMatch : bufferIn.Length;
  38. Array.Copy(bufferIn, 0, tempBuffer, 0, copyLength);
  39. return tempBuffer;
  40. }
  41. return bufferIn;
  42. }
  43. protected abstract void InitializeProperties(object[] properties, int startIndex);
  44. protected abstract void OnInitializePropertiesFromReadBuffer(BinaryReader reader);
  45. protected virtual void InitializePropertiesFromBuffer()
  46. {
  47. using (var stream = new MemoryStream(Buffer))
  48. {
  49. var reader = new BinaryReader(stream);
  50. OnInitializePropertiesFromReadBuffer(reader);
  51. stream.Close();
  52. }
  53. }
  54. protected abstract void OnWriteToBuffer(BinaryWriter writer);
  55. }
  56. }