ReverseWordTransform.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace HslCommunication.Core
  6. {
  7. /// <summary>
  8. /// 按照字节错位的数据转换类
  9. /// </summary>
  10. public class ReverseWordTransform : IByteTransform
  11. {
  12. #region Private Method
  13. /// <summary>
  14. /// 按照字节错位的方法
  15. /// </summary>
  16. /// <param name="buffer"></param>
  17. /// <param name="index"></param>
  18. /// <param name="length"></param>
  19. /// <returns></returns>
  20. private byte[] ReverseBytesByWord( byte[] buffer, int index, int length )
  21. {
  22. byte[] tmp = new byte[length];
  23. for (int i = 0; i < length; i++)
  24. {
  25. tmp[i] = buffer[index + i];
  26. }
  27. for (int i = 0; i < length / 2; i++)
  28. {
  29. byte b = tmp[i * 2 + 0];
  30. tmp[i * 2 + 0] = tmp[i * 2 + 1];
  31. tmp[i * 2 + 1] = b;
  32. }
  33. return tmp;
  34. }
  35. private byte[] ReverseBytesByWord( byte[] buffer )
  36. {
  37. return ReverseBytesByWord( buffer, 0, buffer.Length );
  38. }
  39. #endregion
  40. #region Get Value From Bytes
  41. /// <summary>
  42. /// 从缓存中提取出bool结果
  43. /// </summary>
  44. /// <param name="buffer">缓存数据</param>
  45. /// <returns>bool对象</returns>
  46. public bool TransBool( byte[] buffer )
  47. {
  48. return buffer[0] != 0x00;
  49. }
  50. /// <summary>
  51. /// 从缓存中提取byte结果
  52. /// </summary>
  53. /// <param name="buffer">缓存数据</param>
  54. /// <param name="index">索引位置</param>
  55. /// <returns>byte对象</returns>
  56. public byte TransByte( byte[] buffer, int index )
  57. {
  58. return buffer[index];
  59. }
  60. /// <summary>
  61. /// 从缓存中提取short结果
  62. /// </summary>
  63. /// <param name="buffer">缓存数据</param>
  64. /// <param name="index">索引位置</param>
  65. /// <returns>short对象</returns>
  66. public short TransInt16( byte[] buffer, int index )
  67. {
  68. return BitConverter.ToInt16( ReverseBytesByWord( buffer, index, 2 ), 0 );
  69. }
  70. /// <summary>
  71. /// 从缓存中提取ushort结果
  72. /// </summary>
  73. /// <param name="buffer">缓存数据</param>
  74. /// <param name="index">索引位置</param>
  75. /// <returns>ushort对象</returns>
  76. public ushort TransUInt16( byte[] buffer, int index )
  77. {
  78. return BitConverter.ToUInt16( ReverseBytesByWord( buffer, index, 2 ), 0 );
  79. }
  80. /// <summary>
  81. /// 从缓存中提取int结果
  82. /// </summary>
  83. /// <param name="buffer">缓存数据</param>
  84. /// <param name="index">索引位置</param>
  85. /// <returns>int对象</returns>
  86. public int TransInt32( byte[] buffer, int index )
  87. {
  88. return BitConverter.ToInt32( ReverseBytesByWord( buffer, index, 4 ), 0 );
  89. }
  90. /// <summary>
  91. /// 从缓存中提取uint结果
  92. /// </summary>
  93. /// <param name="buffer">缓存数据</param>
  94. /// <param name="index">索引位置</param>
  95. /// <returns>uint对象</returns>
  96. public uint TransUInt32( byte[] buffer, int index )
  97. {
  98. return BitConverter.ToUInt32( ReverseBytesByWord( buffer, index, 4 ), 0 );
  99. }
  100. /// <summary>
  101. /// 从缓存中提取long结果
  102. /// </summary>
  103. /// <param name="buffer">缓存数据</param>
  104. /// <param name="index">索引位置</param>
  105. /// <returns>long对象</returns>
  106. public long TransInt64( byte[] buffer, int index )
  107. {
  108. return BitConverter.ToInt64( ReverseBytesByWord( buffer, index, 8 ), 0 );
  109. }
  110. /// <summary>
  111. /// 从缓存中提取ulong结果
  112. /// </summary>
  113. /// <param name="buffer">缓存数据</param>
  114. /// <param name="index">索引位置</param>
  115. /// <returns>ulong对象</returns>
  116. public ulong TransUInt64( byte[] buffer, int index )
  117. {
  118. return BitConverter.ToUInt64( ReverseBytesByWord( buffer, index, 8 ), 0 );
  119. }
  120. /// <summary>
  121. /// 从缓存中提取float结果
  122. /// </summary>
  123. /// <param name="buffer">缓存对象</param>
  124. /// <param name="index">索引位置</param>
  125. /// <returns>float对象</returns>
  126. public float TransSingle( byte[] buffer, int index )
  127. {
  128. return BitConverter.ToSingle( ReverseBytesByWord( buffer, index, 4 ), 0 );
  129. }
  130. /// <summary>
  131. /// 从缓存中提取double结果
  132. /// </summary>
  133. /// <param name="buffer">缓存对象</param>
  134. /// <param name="index">索引位置</param>
  135. /// <returns>double对象</returns>
  136. public double TransDouble( byte[] buffer, int index )
  137. {
  138. return BitConverter.ToDouble( ReverseBytesByWord( buffer, index, 8 ), 0 );
  139. }
  140. /// <summary>
  141. /// 从缓存中提取string结果,编码ASCII
  142. /// </summary>
  143. /// <param name="buffer">缓存对象</param>
  144. /// <returns>string对象</returns>
  145. public string TransString( byte[] buffer )
  146. {
  147. return Encoding.ASCII.GetString( buffer );
  148. }
  149. #endregion
  150. #region Get Bytes From Value
  151. /// <summary>
  152. /// bool变量转化缓存数据
  153. /// </summary>
  154. /// <param name="value">等待转化的数据</param>
  155. /// <returns>buffer数据</returns>
  156. public byte[] TransByte( bool value )
  157. {
  158. return value ? new byte[1] { 0x01 } : new byte[1] { 0x00 };
  159. }
  160. /// <summary>
  161. /// bool数组变量转化缓存数据
  162. /// </summary>
  163. /// <param name="values">等待转化的数组</param>
  164. /// <returns>buffer数据</returns>
  165. public byte[] TransByte( bool[] values )
  166. {
  167. return BasicFramework.SoftBasic.BoolArrayToByte( values );
  168. }
  169. /// <summary>
  170. /// byte变量转化缓存数据
  171. /// </summary>
  172. /// <param name="value">等待转化的数据</param>
  173. /// <returns>buffer数据</returns>
  174. public byte[] TransByte( byte value )
  175. {
  176. return new byte[1] { value };
  177. }
  178. /// <summary>
  179. /// short变量转化缓存数据
  180. /// </summary>
  181. /// <param name="value">等待转化的数据</param>
  182. /// <returns>buffer数据</returns>
  183. public byte[] TransByte( short value )
  184. {
  185. return TransByte( new short[] { value } );
  186. }
  187. /// <summary>
  188. /// short数组变量转化缓存数据
  189. /// </summary>
  190. /// <param name="values">等待转化的数组</param>
  191. /// <returns>buffer数据</returns>
  192. public byte[] TransByte( short[] values )
  193. {
  194. if (values == null) return null;
  195. byte[] buffer = new byte[values.Length * 2];
  196. for (int i = 0; i < values.Length; i++)
  197. {
  198. byte[] tmp = BitConverter.GetBytes( values[i] );
  199. tmp.CopyTo( buffer, 2 * i );
  200. }
  201. return ReverseBytesByWord( buffer );
  202. }
  203. /// <summary>
  204. /// ushort变量转化缓存数据
  205. /// </summary>
  206. /// <param name="value">等待转化的数据</param>
  207. /// <returns>buffer数据</returns>
  208. public byte[] TransByte( ushort value )
  209. {
  210. return TransByte( new ushort[] { value } );
  211. }
  212. /// <summary>
  213. /// ushort数组变量转化缓存数据
  214. /// </summary>
  215. /// <param name="values">等待转化的数组</param>
  216. /// <returns>buffer数据</returns>
  217. public byte[] TransByte( ushort[] values )
  218. {
  219. if (values == null) return null;
  220. byte[] buffer = new byte[values.Length * 2];
  221. for (int i = 0; i < values.Length; i++)
  222. {
  223. byte[] tmp = BitConverter.GetBytes( values[i] );
  224. tmp.CopyTo( buffer, 2 * i );
  225. }
  226. return ReverseBytesByWord( buffer );
  227. }
  228. /// <summary>
  229. /// int变量转化缓存数据
  230. /// </summary>
  231. /// <param name="value">等待转化的数据</param>
  232. /// <returns>buffer数据</returns>
  233. public byte[] TransByte( int value )
  234. {
  235. return TransByte( new int[] { value } );
  236. }
  237. /// <summary>
  238. /// int数组变量转化缓存数据
  239. /// </summary>
  240. /// <param name="values">等待转化的数组</param>
  241. /// <returns>buffer数据</returns>
  242. public byte[] TransByte( int[] values )
  243. {
  244. if (values == null) return null;
  245. byte[] buffer = new byte[values.Length * 4];
  246. for (int i = 0; i < values.Length; i++)
  247. {
  248. BitConverter.GetBytes( values[i] ).CopyTo( buffer, 4 * i );
  249. }
  250. return ReverseBytesByWord( buffer );
  251. }
  252. /// <summary>
  253. /// uint变量转化缓存数据
  254. /// </summary>
  255. /// <param name="value">等待转化的数据</param>
  256. /// <returns>buffer数据</returns>
  257. public byte[] TransByte( uint value )
  258. {
  259. return TransByte( new uint[] { value } );
  260. }
  261. /// <summary>
  262. /// uint数组变量转化缓存数据
  263. /// </summary>
  264. /// <param name="values">等待转化的数组</param>
  265. /// <returns>buffer数据</returns>
  266. public byte[] TransByte( uint[] values )
  267. {
  268. if (values == null) return null;
  269. byte[] buffer = new byte[values.Length * 4];
  270. for (int i = 0; i < values.Length; i++)
  271. {
  272. BitConverter.GetBytes( values[i] ).CopyTo( buffer, 4 * i );
  273. }
  274. return ReverseBytesByWord( buffer );
  275. }
  276. /// <summary>
  277. /// long变量转化缓存数据
  278. /// </summary>
  279. /// <param name="value">等待转化的数据</param>
  280. /// <returns>buffer数据</returns>
  281. public byte[] TransByte( long value )
  282. {
  283. return TransByte( new long[] { value } );
  284. }
  285. /// <summary>
  286. /// long数组变量转化缓存数据
  287. /// </summary>
  288. /// <param name="values">等待转化的数组</param>
  289. /// <returns>buffer数据</returns>
  290. public byte[] TransByte( long[] values )
  291. {
  292. if (values == null) return null;
  293. byte[] buffer = new byte[values.Length * 8];
  294. for (int i = 0; i < values.Length; i++)
  295. {
  296. BitConverter.GetBytes( values[i] ).CopyTo( buffer, 8 * i );
  297. }
  298. return ReverseBytesByWord( buffer );
  299. }
  300. /// <summary>
  301. /// ulong变量转化缓存数据
  302. /// </summary>
  303. /// <param name="value">等待转化的数据</param>
  304. /// <returns>buffer数据</returns>
  305. public byte[] TransByte( ulong value )
  306. {
  307. return TransByte( new ulong[] { value } );
  308. }
  309. /// <summary>
  310. /// ulong数组变量转化缓存数据
  311. /// </summary>
  312. /// <param name="values">等待转化的数组</param>
  313. /// <returns>buffer数据</returns>
  314. public byte[] TransByte( ulong[] values )
  315. {
  316. if (values == null) return null;
  317. byte[] buffer = new byte[values.Length * 8];
  318. for (int i = 0; i < values.Length; i++)
  319. {
  320. BitConverter.GetBytes( values[i] ).CopyTo( buffer, 8 * i );
  321. }
  322. return ReverseBytesByWord( buffer );
  323. }
  324. /// <summary>
  325. /// float变量转化缓存数据
  326. /// </summary>
  327. /// <param name="value">等待转化的数据</param>
  328. /// <returns>buffer数据</returns>
  329. public byte[] TransByte( float value )
  330. {
  331. return TransByte( new float[] { value } );
  332. }
  333. /// <summary>
  334. /// float数组变量转化缓存数据
  335. /// </summary>
  336. /// <param name="values">等待转化的数组</param>
  337. /// <returns>buffer数据</returns>
  338. public byte[] TransByte( float[] values )
  339. {
  340. if (values == null) return null;
  341. byte[] buffer = new byte[values.Length * 4];
  342. for (int i = 0; i < values.Length; i++)
  343. {
  344. BitConverter.GetBytes( values[i] ).CopyTo( buffer, 4 * i );
  345. }
  346. return ReverseBytesByWord( buffer );
  347. }
  348. /// <summary>
  349. /// double变量转化缓存数据
  350. /// </summary>
  351. /// <param name="value">等待转化的数据</param>
  352. /// <returns>buffer数据</returns>
  353. public byte[] TransByte( double value )
  354. {
  355. return TransByte( new double[] { value } );
  356. }
  357. /// <summary>
  358. /// double数组变量转化缓存数据
  359. /// </summary>
  360. /// <param name="values">等待转化的数组</param>
  361. /// <returns>buffer数据</returns>
  362. public byte[] TransByte( double[] values )
  363. {
  364. if (values == null) return null;
  365. byte[] buffer = new byte[values.Length * 8];
  366. for (int i = 0; i < values.Length; i++)
  367. {
  368. BitConverter.GetBytes( values[i] ).CopyTo( buffer, 8 * i );
  369. }
  370. return ReverseBytesByWord( buffer );
  371. }
  372. /// <summary>
  373. /// ASCII编码字符串转化缓存数据
  374. /// </summary>
  375. /// <param name="value">等待转化的数据</param>
  376. /// <returns>buffer数据</returns>
  377. public byte[] TransByte( string value )
  378. {
  379. return Encoding.ASCII.GetBytes( value );
  380. }
  381. #endregion
  382. }
  383. }