ReverseWordTrans.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. using HslCommunication.Core;
  2. using System.Text;
  3. namespace GCAS.Code
  4. {
  5. public class ReverseWordTrans : ByteTransformBase
  6. {
  7. #region Constructor
  8. /// <summary>
  9. /// 使用指定的数据解析来实例化对象
  10. /// </summary>
  11. /// <param name="dataFormat">数据规则</param>
  12. public ReverseWordTrans(DataFormat dataFormat) : base(dataFormat)
  13. {
  14. }
  15. #endregion
  16. #region Private Method
  17. /// <summary>
  18. /// 按照字节错位的方法
  19. /// </summary>
  20. /// <param name="buffer">实际的字节数据</param>
  21. /// <param name="index">起始字节位置</param>
  22. /// <param name="length">数据长度</param>
  23. /// <returns>处理过的数据信息</returns>
  24. private byte[] ReverseBytesByWord(byte[] buffer, int index, int length)
  25. {
  26. if (buffer == null) return null;
  27. // copy data
  28. byte[] tmp = new byte[length];
  29. for (int i = 0; i < length; i++)
  30. {
  31. tmp[i] = buffer[index + i];
  32. }
  33. // change
  34. for (int i = 0; i < length / 2; i++)
  35. {
  36. byte b = tmp[i * 2 + 0];
  37. tmp[i * 2 + 0] = tmp[i * 2 + 1];
  38. tmp[i * 2 + 1] = b;
  39. }
  40. return tmp;
  41. }
  42. private byte[] ReverseBytesByWord(byte[] buffer)
  43. {
  44. return ReverseBytesByWord(buffer, 0, buffer.Length);
  45. }
  46. #endregion
  47. #region Public Properties
  48. /// <summary>
  49. /// 字符串数据是否按照字来反转
  50. /// </summary>
  51. public bool IsStringReverse { get; set; }
  52. #endregion
  53. #region Get Value From Bytes
  54. /// <summary>
  55. /// 从缓存中提取short结果
  56. /// </summary>
  57. /// <param name="buffer">缓存数据</param>
  58. /// <param name="index">索引位置</param>
  59. /// <returns>short对象</returns>
  60. public override short TransInt16(byte[] buffer, int index)
  61. {
  62. return base.TransInt16(ReverseBytesByWord(buffer, index, 2), 0);
  63. }
  64. /// <summary>
  65. /// 从缓存中提取ushort结果
  66. /// </summary>
  67. /// <param name="buffer">缓存数据</param>
  68. /// <param name="index">索引位置</param>
  69. /// <returns>ushort对象</returns>
  70. public override ushort TransUInt16(byte[] buffer, int index)
  71. {
  72. return base.TransUInt16(ReverseBytesByWord(buffer, index, 2), 0);
  73. }
  74. /// <summary>
  75. /// 从缓存中提取string结果,使用指定的编码
  76. /// </summary>
  77. /// <param name="buffer">缓存对象</param>
  78. /// <param name="index">索引位置</param>
  79. /// <param name="length">byte数组长度</param>
  80. /// <param name="encoding">字符串的编码</param>
  81. /// <returns>string对象</returns>
  82. public override string TransString(byte[] buffer, int index, int length, Encoding encoding)
  83. {
  84. byte[] tmp = TransByte(buffer, index, length);
  85. if (IsStringReverse)
  86. {
  87. return encoding.GetString(ReverseBytesByWord(tmp));
  88. }
  89. else
  90. {
  91. return encoding.GetString(tmp);
  92. }
  93. }
  94. #endregion
  95. #region Get Bytes From Value
  96. /// <summary>
  97. /// short数组变量转化缓存数据
  98. /// </summary>
  99. /// <param name="values">等待转化的数组</param>
  100. /// <returns>buffer数据</returns>
  101. public override byte[] TransByte(short[] values)
  102. {
  103. byte[] buffer = base.TransByte(values);
  104. return ReverseBytesByWord(buffer);
  105. }
  106. /// <summary>
  107. /// ushort数组变量转化缓存数据
  108. /// </summary>
  109. /// <param name="values">等待转化的数组</param>
  110. /// <returns>buffer数据</returns>
  111. public override byte[] TransByte(ushort[] values)
  112. {
  113. byte[] buffer = base.TransByte(values);
  114. return ReverseBytesByWord(buffer);
  115. }
  116. /// <summary>
  117. /// 使用指定的编码字符串转化缓存数据
  118. /// </summary>
  119. /// <param name="value">等待转化的数据</param>
  120. /// <param name="encoding">字符串的编码方式</param>
  121. /// <returns>buffer数据</returns>
  122. public override byte[] TransByte(string value, Encoding encoding)
  123. {
  124. if (value == null) return null;
  125. byte[] buffer = encoding.GetBytes(value);
  126. buffer = HslCommunication.BasicFramework.SoftBasic.ArrayExpandToLengthEven(buffer);
  127. if (IsStringReverse)
  128. {
  129. return ReverseBytesByWord(buffer);
  130. }
  131. else
  132. {
  133. return buffer;
  134. }
  135. }
  136. #endregion
  137. }
  138. }