TlvContentLayer.cs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. namespace TLVProtocal;
  2. internal class TlvContentLayer(bool ConvertToBigEnd) : BaseFilter
  3. {
  4. public override bool Receive(Data data)
  5. {
  6. if (data.RawData is null || data.RawData.Length <= 2)
  7. return false;
  8. if (data is not TlvData tlv)
  9. return false;
  10. ushort tag;
  11. if (ConvertToBigEnd)
  12. {
  13. byte[] lengthByte = new byte[2];
  14. Array.Copy(data.RawData, lengthByte, 2);
  15. Array.Reverse(lengthByte);
  16. tag = BitConverter.ToUInt16(lengthByte, 0);
  17. }
  18. else
  19. tag = BitConverter.ToUInt16(data.RawData, 0);
  20. byte[] content = new byte[data.RawData.Length - 2];
  21. Array.Copy(data.RawData, 2, content, 0, content.Length);
  22. if (ConvertToBigEnd)
  23. Array.Reverse(content);
  24. TlvData dataTLV = new(tag, content, data.Connection, data.DateTime);
  25. dataTLV.RequestID = tlv.RequestID;
  26. return base.Receive(dataTLV);
  27. }
  28. public override bool Send(Data data)
  29. {
  30. if (data is not TlvData tlv)
  31. return false;
  32. byte[] tag = BitConverter.GetBytes(tlv.Tag);
  33. byte[] content = tlv.RawData;
  34. if (ConvertToBigEnd)
  35. {
  36. Array.Reverse(tag);
  37. Array.Reverse(content);
  38. }
  39. List<byte> bytes = [];
  40. bytes.AddRange(tag);
  41. bytes.AddRange(content);
  42. TlvData tlvData = new(tlv.Tag, [.. bytes], data.Connection, data.DateTime);
  43. tlvData.RequestID = tlv.RequestID;
  44. return base.Send(tlvData);
  45. }
  46. }