ByteTransform.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591
  1. using SWRIS.Enums;
  2. using System;
  3. using System.Text;
  4. namespace SWRIS.Extensions
  5. {
  6. public class ByteTransform
  7. {
  8. #region Constructor
  9. /// <summary>
  10. /// 实例化一个默认的对象<br />
  11. /// Instantiate a default object
  12. /// </summary>
  13. public ByteTransform()
  14. {
  15. DataFormat = DataFormat.ABCD;
  16. }
  17. /// <summary>
  18. /// 使用指定的数据解析来实例化对象<br />
  19. /// Instantiate the object using the specified data parsing
  20. /// </summary>
  21. /// <param name="dataFormat">数据规则</param>
  22. public ByteTransform(DataFormat dataFormat)
  23. {
  24. this.DataFormat = dataFormat;
  25. }
  26. #endregion
  27. #region Get Value From Bytes
  28. /// <inheritdoc cref="IByteTransform.TransBool(byte[], int)"/>
  29. public virtual bool TransBool(byte[] buffer, int index) => GetBoolByIndex(buffer, index);
  30. /// <inheritdoc cref="IByteTransform.TransBool(byte[], int, int)"/>
  31. public virtual bool[] TransBool(byte[] buffer, int index, int length)
  32. {
  33. bool[] result = new bool[length];
  34. for (int i = 0; i < length; i++)
  35. {
  36. result[i] = GetBoolByIndex(buffer, i + index);
  37. }
  38. return result;
  39. }
  40. /// <summary>
  41. /// 获取Byte数组的第 boolIndex 偏移的bool值,这个偏移值可以为 10,就是第 1 个字节的 第3位 <br />
  42. /// Get the bool value of the boolIndex offset of the Byte array. The offset value can be 10, which is the third bit of the first byte
  43. /// </summary>
  44. /// <param name="bytes">字节数组信息</param>
  45. /// <param name="boolIndex">指定字节的位偏移</param>
  46. /// <returns>bool值</returns>
  47. public static bool GetBoolByIndex(byte[] bytes, int boolIndex)
  48. {
  49. return SoftBasic.BoolOnByteIndex(bytes[boolIndex / 8], boolIndex % 8);
  50. }
  51. /// <inheritdoc cref="IByteTransform.TransByte(byte[], int)"/>
  52. public virtual byte TransByte(byte[] buffer, int index) => buffer[index];
  53. /// <inheritdoc cref="IByteTransform.TransByte(byte[], int, int)"/>
  54. public virtual byte[] TransByte(byte[] buffer, int index, int length)
  55. {
  56. byte[] tmp = new byte[length];
  57. Array.Copy(buffer, index, tmp, 0, length);
  58. return tmp;
  59. }
  60. /// <inheritdoc cref="IByteTransform.TransInt16(byte[], int)"/>
  61. public virtual short TransInt16(byte[] buffer, int index) => BitConverter.ToInt16(ByteTransDataFormat2(buffer, index), 0);
  62. /// <inheritdoc cref="IByteTransform.TransInt16(byte[], int, int)"/>
  63. public virtual short[] TransInt16(byte[] buffer, int index, int length)
  64. {
  65. short[] tmp = new short[length];
  66. for (int i = 0; i < length; i++)
  67. {
  68. tmp[i] = TransInt16(buffer, index + 2 * i);
  69. }
  70. return tmp;
  71. }
  72. /// <inheritdoc cref="IByteTransform.TransInt16(byte[], int, int, int)"/>
  73. public short[,] TransInt16(byte[] buffer, int index, int row, int col)
  74. {
  75. return CreateTwoArrayFromOneArray(TransInt16(buffer, index, row * col), row, col);
  76. }
  77. /// <inheritdoc cref="IByteTransform.TransUInt16(byte[], int)"/>
  78. public virtual ushort TransUInt16(byte[] buffer, int index) => BitConverter.ToUInt16(ByteTransDataFormat2(buffer, index), 0);
  79. /// <inheritdoc cref="IByteTransform.TransUInt16(byte[], int, int)"/>
  80. public virtual ushort[] TransUInt16(byte[] buffer, int index, int length)
  81. {
  82. ushort[] tmp = new ushort[length];
  83. for (int i = 0; i < length; i++)
  84. {
  85. tmp[i] = TransUInt16(buffer, index + 2 * i);
  86. }
  87. return tmp;
  88. }
  89. /// <inheritdoc cref="IByteTransform.TransUInt16(byte[], int, int, int)"/>
  90. public ushort[,] TransUInt16(byte[] buffer, int index, int row, int col)
  91. {
  92. return CreateTwoArrayFromOneArray(TransUInt16(buffer, index, row * col), row, col);
  93. }
  94. /// <inheritdoc cref="IByteTransform.TransInt32(byte[], int)"/>
  95. public virtual int TransInt32(byte[] buffer, int index) => BitConverter.ToInt32(ByteTransDataFormat4(buffer, index), 0);
  96. /// <inheritdoc cref="IByteTransform.TransInt32(byte[], int, int)"/>
  97. public virtual int[] TransInt32(byte[] buffer, int index, int length)
  98. {
  99. int[] tmp = new int[length];
  100. for (int i = 0; i < length; i++)
  101. {
  102. tmp[i] = TransInt32(buffer, index + 4 * i);
  103. }
  104. return tmp;
  105. }
  106. /// <inheritdoc cref="IByteTransform.TransInt32(byte[], int, int, int)"/>
  107. public int[,] TransInt32(byte[] buffer, int index, int row, int col)
  108. {
  109. return CreateTwoArrayFromOneArray(TransInt32(buffer, index, row * col), row, col);
  110. }
  111. /// <inheritdoc cref="IByteTransform.TransUInt32(byte[], int)"/>
  112. public virtual uint TransUInt32(byte[] buffer, int index) => BitConverter.ToUInt32(ByteTransDataFormat4(buffer, index), 0);
  113. /// <inheritdoc cref="IByteTransform.TransUInt32(byte[], int, int)"/>
  114. public virtual uint[] TransUInt32(byte[] buffer, int index, int length)
  115. {
  116. uint[] tmp = new uint[length];
  117. for (int i = 0; i < length; i++)
  118. {
  119. tmp[i] = TransUInt32(buffer, index + 4 * i);
  120. }
  121. return tmp;
  122. }
  123. /// <inheritdoc cref="IByteTransform.TransUInt32(byte[], int, int, int)"/>
  124. public uint[,] TransUInt32(byte[] buffer, int index, int row, int col)
  125. {
  126. return CreateTwoArrayFromOneArray(TransUInt32(buffer, index, row * col), row, col);
  127. }
  128. /// <inheritdoc cref="IByteTransform.TransInt64(byte[], int)"/>
  129. public virtual long TransInt64(byte[] buffer, int index) => BitConverter.ToInt64(ByteTransDataFormat8(buffer, index), 0);
  130. /// <inheritdoc cref="IByteTransform.TransInt64(byte[], int, int)"/>
  131. public virtual long[] TransInt64(byte[] buffer, int index, int length)
  132. {
  133. long[] tmp = new long[length];
  134. for (int i = 0; i < length; i++)
  135. {
  136. tmp[i] = TransInt64(buffer, index + 8 * i);
  137. }
  138. return tmp;
  139. }
  140. /// <inheritdoc cref="IByteTransform.TransInt64(byte[], int, int, int)"/>
  141. public long[,] TransInt64(byte[] buffer, int index, int row, int col)
  142. {
  143. return CreateTwoArrayFromOneArray(TransInt64(buffer, index, row * col), row, col);
  144. }
  145. /// <inheritdoc cref="IByteTransform.TransUInt64(byte[], int)"/>
  146. public virtual ulong TransUInt64(byte[] buffer, int index) => BitConverter.ToUInt64(ByteTransDataFormat8(buffer, index), 0);
  147. /// <inheritdoc cref="IByteTransform.TransUInt64(byte[], int, int)"/>
  148. public virtual ulong[] TransUInt64(byte[] buffer, int index, int length)
  149. {
  150. ulong[] tmp = new ulong[length];
  151. for (int i = 0; i < length; i++)
  152. {
  153. tmp[i] = TransUInt64(buffer, index + 8 * i);
  154. }
  155. return tmp;
  156. }
  157. /// <inheritdoc cref="IByteTransform.TransUInt64(byte[], int, int, int)"/>
  158. public ulong[,] TransUInt64(byte[] buffer, int index, int row, int col)
  159. {
  160. return CreateTwoArrayFromOneArray(TransUInt64(buffer, index, row * col), row, col);
  161. }
  162. /// <inheritdoc cref="IByteTransform.TransSingle(byte[], int)"/>
  163. public virtual float TransSingle(byte[] buffer, int index) => BitConverter.ToSingle(ByteTransDataFormat4(buffer, index), 0);
  164. /// <inheritdoc cref="IByteTransform.TransSingle(byte[], int, int)"/>
  165. public virtual float[] TransSingle(byte[] buffer, int index, int length)
  166. {
  167. float[] tmp = new float[length];
  168. for (int i = 0; i < length; i++)
  169. {
  170. tmp[i] = TransSingle(buffer, index + 4 * i);
  171. }
  172. return tmp;
  173. }
  174. /// <inheritdoc cref="IByteTransform.TransSingle(byte[], int, int, int)"/>
  175. public float[,] TransSingle(byte[] buffer, int index, int row, int col)
  176. {
  177. return CreateTwoArrayFromOneArray(TransSingle(buffer, index, row * col), row, col);
  178. }
  179. /// <inheritdoc cref="IByteTransform.TransDouble(byte[], int)"/>
  180. public virtual double TransDouble(byte[] buffer, int index) => BitConverter.ToDouble(ByteTransDataFormat8(buffer, index), 0);
  181. /// <inheritdoc cref="IByteTransform.TransDouble(byte[], int, int)"/>
  182. public virtual double[] TransDouble(byte[] buffer, int index, int length)
  183. {
  184. double[] tmp = new double[length];
  185. for (int i = 0; i < length; i++)
  186. {
  187. tmp[i] = TransDouble(buffer, index + 8 * i);
  188. }
  189. return tmp;
  190. }
  191. /// <inheritdoc cref="IByteTransform.TransDouble(byte[], int, int, int)"/>
  192. public double[,] TransDouble(byte[] buffer, int index, int row, int col)
  193. {
  194. return CreateTwoArrayFromOneArray(TransDouble(buffer, index, row * col), row, col);
  195. }
  196. /// <inheritdoc cref="IByteTransform.TransString(byte[], int, int, Encoding)"/>
  197. public virtual string TransString(byte[] buffer, int index, int length, Encoding encoding)
  198. {
  199. byte[] tmp = TransByte(buffer, index, length);
  200. if (IsStringReverseByteWord)
  201. return encoding.GetString(SoftBasic.BytesReverseByWord(tmp));
  202. else
  203. return encoding.GetString(tmp);
  204. }
  205. /// <summary>
  206. /// 将一个一维数组中的所有数据按照行列信息拷贝到二维数组里,返回当前的二维数组
  207. /// </summary>
  208. /// <typeparam name="T">数组的类型对象</typeparam>
  209. /// <param name="array">一维数组信息</param>
  210. /// <param name="row">行</param>
  211. /// <param name="col">列</param>
  212. public static T[,] CreateTwoArrayFromOneArray<T>(T[] array, int row, int col)
  213. {
  214. T[,] twoArray = new T[row, col];
  215. int count = 0;
  216. for (int i = 0; i < row; i++)
  217. {
  218. for (int j = 0; j < col; j++)
  219. {
  220. twoArray[i, j] = array[count];
  221. count++;
  222. }
  223. }
  224. return twoArray;
  225. }
  226. /// <inheritdoc cref="IByteTransform.TransString(byte[], Encoding)"/>
  227. public virtual string TransString(byte[] buffer, Encoding encoding) => encoding.GetString(buffer);
  228. #endregion
  229. #region Get Bytes From Value
  230. /// <inheritdoc cref="IByteTransform.TransByte(bool)"/>
  231. public virtual byte[] TransByte(bool value) => TransByte(new bool[] { value });
  232. /// <inheritdoc cref="IByteTransform.TransByte(bool[])"/>
  233. public virtual byte[] TransByte(bool[] values) => values == null ? null : SoftBasic.BoolArrayToByte(values);
  234. /// <inheritdoc cref="IByteTransform.TransByte(byte)"/>
  235. public virtual byte[] TransByte(byte value) => new byte[] { value };
  236. /// <inheritdoc cref="IByteTransform.TransByte(short)"/>
  237. public virtual byte[] TransByte(short value) => TransByte(new short[] { value });
  238. /// <inheritdoc cref="IByteTransform.TransByte(short[])"/>
  239. public virtual byte[] TransByte(short[] values)
  240. {
  241. if (values == null) return null;
  242. byte[] buffer = new byte[values.Length * 2];
  243. for (int i = 0; i < values.Length; i++)
  244. {
  245. ByteTransDataFormat2(BitConverter.GetBytes(values[i])).CopyTo(buffer, 2 * i);
  246. }
  247. return buffer;
  248. }
  249. /// <inheritdoc cref="IByteTransform.TransByte(ushort)"/>
  250. public virtual byte[] TransByte(ushort value) => TransByte(new ushort[] { value });
  251. /// <inheritdoc cref="IByteTransform.TransByte(ushort[])"/>
  252. public virtual byte[] TransByte(ushort[] values)
  253. {
  254. if (values == null) return null;
  255. byte[] buffer = new byte[values.Length * 2];
  256. for (int i = 0; i < values.Length; i++)
  257. {
  258. ByteTransDataFormat2(BitConverter.GetBytes(values[i])).CopyTo(buffer, 2 * i);
  259. }
  260. return buffer;
  261. }
  262. /// <inheritdoc cref="IByteTransform.TransByte(int)"/>
  263. public virtual byte[] TransByte(int value) => TransByte(new int[] { value });
  264. /// <inheritdoc cref="IByteTransform.TransByte(int[])"/>
  265. public virtual byte[] TransByte(int[] values)
  266. {
  267. if (values == null) return null;
  268. byte[] buffer = new byte[values.Length * 4];
  269. for (int i = 0; i < values.Length; i++)
  270. {
  271. ByteTransDataFormat4(BitConverter.GetBytes(values[i])).CopyTo(buffer, 4 * i);
  272. }
  273. return buffer;
  274. }
  275. /// <inheritdoc cref="IByteTransform.TransByte(uint)"/>
  276. public virtual byte[] TransByte(uint value) => TransByte(new uint[] { value });
  277. /// <inheritdoc cref="IByteTransform.TransByte(uint[])"/>
  278. public virtual byte[] TransByte(uint[] values)
  279. {
  280. if (values == null) return null;
  281. byte[] buffer = new byte[values.Length * 4];
  282. for (int i = 0; i < values.Length; i++)
  283. {
  284. ByteTransDataFormat4(BitConverter.GetBytes(values[i])).CopyTo(buffer, 4 * i);
  285. }
  286. return buffer;
  287. }
  288. /// <inheritdoc cref="IByteTransform.TransByte(long)"/>
  289. public virtual byte[] TransByte(long value) => TransByte(new long[] { value });
  290. /// <inheritdoc cref="IByteTransform.TransByte(long[])"/>
  291. public virtual byte[] TransByte(long[] values)
  292. {
  293. if (values == null) return null;
  294. byte[] buffer = new byte[values.Length * 8];
  295. for (int i = 0; i < values.Length; i++)
  296. {
  297. ByteTransDataFormat8(BitConverter.GetBytes(values[i])).CopyTo(buffer, 8 * i);
  298. }
  299. return buffer;
  300. }
  301. /// <inheritdoc cref="IByteTransform.TransByte(ulong)"/>
  302. public virtual byte[] TransByte(ulong value) => TransByte(new ulong[] { value });
  303. /// <inheritdoc cref="IByteTransform.TransByte(ulong[])"/>
  304. public virtual byte[] TransByte(ulong[] values)
  305. {
  306. if (values == null) return null;
  307. byte[] buffer = new byte[values.Length * 8];
  308. for (int i = 0; i < values.Length; i++)
  309. {
  310. ByteTransDataFormat8(BitConverter.GetBytes(values[i])).CopyTo(buffer, 8 * i);
  311. }
  312. return buffer;
  313. }
  314. /// <inheritdoc cref="IByteTransform.TransByte(float)"/>
  315. public virtual byte[] TransByte(float value) => TransByte(new float[] { value });
  316. /// <inheritdoc cref="IByteTransform.TransByte(float[])"/>
  317. public virtual byte[] TransByte(float[] values)
  318. {
  319. if (values == null) return null;
  320. byte[] buffer = new byte[values.Length * 4];
  321. for (int i = 0; i < values.Length; i++)
  322. {
  323. ByteTransDataFormat4(BitConverter.GetBytes(values[i])).CopyTo(buffer, 4 * i);
  324. }
  325. return buffer;
  326. }
  327. /// <inheritdoc cref="IByteTransform.TransByte(double)"/>
  328. public virtual byte[] TransByte(double value) => TransByte(new double[] { value });
  329. /// <inheritdoc cref="IByteTransform.TransByte(double[])"/>
  330. public virtual byte[] TransByte(double[] values)
  331. {
  332. if (values == null) return null;
  333. byte[] buffer = new byte[values.Length * 8];
  334. for (int i = 0; i < values.Length; i++)
  335. {
  336. ByteTransDataFormat8(BitConverter.GetBytes(values[i])).CopyTo(buffer, 8 * i);
  337. }
  338. return buffer;
  339. }
  340. /// <inheritdoc cref="IByteTransform.TransByte(string, Encoding)"/>
  341. public virtual byte[] TransByte(string value, Encoding encoding)
  342. {
  343. if (value == null) return null;
  344. byte[] buffer = encoding.GetBytes(value);
  345. return IsStringReverseByteWord ? SoftBasic.BytesReverseByWord(buffer) : buffer;
  346. }
  347. /// <inheritdoc cref="IByteTransform.TransByte(string, int, Encoding)"/>
  348. public virtual byte[] TransByte(string value, int length, Encoding encoding)
  349. {
  350. if (value == null) return null;
  351. byte[] buffer = encoding.GetBytes(value);
  352. return IsStringReverseByteWord ? SoftBasic.ArrayExpandToLength(SoftBasic.BytesReverseByWord(buffer), length) : SoftBasic.ArrayExpandToLength(buffer, length);
  353. }
  354. #endregion
  355. #region DataFormat Support
  356. /// <summary>
  357. /// 反转两个字节的数据信息
  358. /// </summary>
  359. /// <param name="value">原始字节数据</param>
  360. /// <param name="index">起始的索引</param>
  361. /// <returns>反转后的字节</returns>
  362. protected virtual byte[] ByteTransDataFormat2(byte[] value, int index = 0)
  363. {
  364. byte[] buffer = new byte[2];
  365. switch (DataFormat)
  366. {
  367. case DataFormat.ABCD:
  368. case DataFormat.CDAB:
  369. {
  370. buffer[0] = value[index + 1];
  371. buffer[1] = value[index + 0];
  372. break;
  373. }
  374. case DataFormat.BADC:
  375. case DataFormat.DCBA:
  376. {
  377. buffer[0] = value[index + 0];
  378. buffer[1] = value[index + 1];
  379. break;
  380. }
  381. }
  382. return buffer;
  383. }
  384. /// <summary>
  385. /// 反转多字节的数据信息
  386. /// </summary>
  387. /// <param name="value">数据字节</param>
  388. /// <param name="index">起始索引,默认值为0</param>
  389. /// <returns>实际字节信息</returns>
  390. protected virtual byte[] ByteTransDataFormat4(byte[] value, int index = 0)
  391. {
  392. byte[] buffer = new byte[4];
  393. switch (DataFormat)
  394. {
  395. case DataFormat.ABCD:
  396. {
  397. buffer[0] = value[index + 3];
  398. buffer[1] = value[index + 2];
  399. buffer[2] = value[index + 1];
  400. buffer[3] = value[index + 0];
  401. break;
  402. }
  403. case DataFormat.BADC:
  404. {
  405. buffer[0] = value[index + 2];
  406. buffer[1] = value[index + 3];
  407. buffer[2] = value[index + 0];
  408. buffer[3] = value[index + 1];
  409. break;
  410. }
  411. case DataFormat.CDAB:
  412. {
  413. buffer[0] = value[index + 1];
  414. buffer[1] = value[index + 0];
  415. buffer[2] = value[index + 3];
  416. buffer[3] = value[index + 2];
  417. break;
  418. }
  419. case DataFormat.DCBA:
  420. {
  421. buffer[0] = value[index + 0];
  422. buffer[1] = value[index + 1];
  423. buffer[2] = value[index + 2];
  424. buffer[3] = value[index + 3];
  425. break;
  426. }
  427. }
  428. return buffer;
  429. }
  430. /// <summary>
  431. /// 反转多字节的数据信息
  432. /// </summary>
  433. /// <param name="value">数据字节</param>
  434. /// <param name="index">起始索引,默认值为0</param>
  435. /// <returns>实际字节信息</returns>
  436. protected virtual byte[] ByteTransDataFormat8(byte[] value, int index = 0)
  437. {
  438. byte[] buffer = new byte[8];
  439. switch (DataFormat)
  440. {
  441. case DataFormat.ABCD:
  442. {
  443. buffer[0] = value[index + 7];
  444. buffer[1] = value[index + 6];
  445. buffer[2] = value[index + 5];
  446. buffer[3] = value[index + 4];
  447. buffer[4] = value[index + 3];
  448. buffer[5] = value[index + 2];
  449. buffer[6] = value[index + 1];
  450. buffer[7] = value[index + 0];
  451. break;
  452. }
  453. case DataFormat.BADC:
  454. {
  455. buffer[0] = value[index + 6];
  456. buffer[1] = value[index + 7];
  457. buffer[2] = value[index + 4];
  458. buffer[3] = value[index + 5];
  459. buffer[4] = value[index + 2];
  460. buffer[5] = value[index + 3];
  461. buffer[6] = value[index + 0];
  462. buffer[7] = value[index + 1];
  463. break;
  464. }
  465. case DataFormat.CDAB:
  466. {
  467. buffer[0] = value[index + 1];
  468. buffer[1] = value[index + 0];
  469. buffer[2] = value[index + 3];
  470. buffer[3] = value[index + 2];
  471. buffer[4] = value[index + 5];
  472. buffer[5] = value[index + 4];
  473. buffer[6] = value[index + 7];
  474. buffer[7] = value[index + 6];
  475. break;
  476. }
  477. case DataFormat.DCBA:
  478. {
  479. buffer[0] = value[index + 0];
  480. buffer[1] = value[index + 1];
  481. buffer[2] = value[index + 2];
  482. buffer[3] = value[index + 3];
  483. buffer[4] = value[index + 4];
  484. buffer[5] = value[index + 5];
  485. buffer[6] = value[index + 6];
  486. buffer[7] = value[index + 7];
  487. break;
  488. }
  489. }
  490. return buffer;
  491. }
  492. #endregion
  493. #region Public Properties
  494. /// <inheritdoc cref="IByteTransform.DataFormat"/>
  495. public DataFormat DataFormat { get; set; }
  496. /// <inheritdoc cref="IByteTransform.IsStringReverseByteWord"/>
  497. public bool IsStringReverseByteWord { get; set; }
  498. #endregion
  499. #region Object Override
  500. /// <inheritdoc/>
  501. public override string ToString() => $"RegularByteTransform[{DataFormat}]";
  502. #endregion
  503. }
  504. }