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.

155 lines
7.1 KiB

8 months ago
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. namespace Mirle.Component.MPLC.FileData
  5. {
  6. /// <summary>
  7. ///
  8. /// </summary>
  9. public class RawRecord
  10. {
  11. /// <summary>
  12. ///
  13. /// </summary>
  14. /// <param name="rawString"></param>
  15. public RawRecord(string rawString)
  16. {
  17. _rawString = rawString;
  18. }
  19. /// <summary>
  20. ///
  21. /// </summary>
  22. private readonly object _cachedLock = new object();
  23. /// <summary>
  24. ///
  25. /// </summary>
  26. private readonly List<byte[]> _cachedRawData = new List<byte[]>();
  27. /// <summary>
  28. ///
  29. /// </summary>
  30. private string _rawString;
  31. /// <summary>
  32. ///
  33. /// </summary>
  34. public bool IsCached { get; private set; }
  35. /// <summary>
  36. /// 位元組尋找表
  37. /// </summary>
  38. private readonly Dictionary<string, byte> ByteLookup = new Dictionary<string, byte>()
  39. {
  40. {"00", 0}, {"01", 1}, {"02", 2}, {"03", 3}, {"04", 4}, {"05", 5}, {"06", 6}, {"07", 7},
  41. {"08", 8}, {"09", 9}, {"0A", 10}, {"0B", 11}, {"0C", 12}, {"0D", 13}, {"0E", 14}, {"0F", 15},
  42. {"10", 16}, {"11", 17}, {"12", 18}, {"13", 19}, {"14", 20}, {"15", 21}, {"16", 22}, {"17", 23},
  43. {"18", 24}, {"19", 25}, {"1A", 26}, {"1B", 27}, {"1C", 28}, {"1D", 29}, {"1E", 30}, {"1F", 31},
  44. {"20", 32}, {"21", 33}, {"22", 34}, {"23", 35}, {"24", 36}, {"25", 37}, {"26", 38}, {"27", 39},
  45. {"28", 40}, {"29", 41}, {"2A", 42}, {"2B", 43}, {"2C", 44}, {"2D", 45}, {"2E", 46}, {"2F", 47},
  46. {"30", 48}, {"31", 49}, {"32", 50}, {"33", 51}, {"34", 52}, {"35", 53}, {"36", 54}, {"37", 55},
  47. {"38", 56}, {"39", 57}, {"3A", 58}, {"3B", 59}, {"3C", 60}, {"3D", 61}, {"3E", 62}, {"3F", 63},
  48. {"40", 64}, {"41", 65}, {"42", 66}, {"43", 67}, {"44", 68}, {"45", 69}, {"46", 70}, {"47", 71},
  49. {"48", 72}, {"49", 73}, {"4A", 74}, {"4B", 75}, {"4C", 76}, {"4D", 77}, {"4E", 78}, {"4F", 79},
  50. {"50", 80}, {"51", 81}, {"52", 82}, {"53", 83}, {"54", 84}, {"55", 85}, {"56", 86}, {"57", 87},
  51. {"58", 88}, {"59", 89}, {"5A", 90}, {"5B", 91}, {"5C", 92}, {"5D", 93}, {"5E", 94}, {"5F", 95},
  52. {"60", 96}, {"61", 97}, {"62", 98}, {"63", 99}, {"64", 100}, {"65", 101}, {"66", 102}, {"67", 103},
  53. {"68", 104}, {"69", 105}, {"6A", 106}, {"6B", 107}, {"6C", 108}, {"6D", 109}, {"6E", 110}, {"6F", 111},
  54. {"70", 112}, {"71", 113}, {"72", 114}, {"73", 115}, {"74", 116}, {"75", 117}, {"76", 118}, {"77", 119},
  55. {"78", 120}, {"79", 121}, {"7A", 122}, {"7B", 123}, {"7C", 124}, {"7D", 125}, {"7E", 126}, {"7F", 127},
  56. {"80", 128}, {"81", 129}, {"82", 130}, {"83", 131}, {"84", 132}, {"85", 133}, {"86", 134}, {"87", 135},
  57. {"88", 136}, {"89", 137}, {"8A", 138}, {"8B", 139}, {"8C", 140}, {"8D", 141}, {"8E", 142}, {"8F", 143},
  58. {"90", 144}, {"91", 145}, {"92", 146}, {"93", 147}, {"94", 148}, {"95", 149}, {"96", 150}, {"97", 151},
  59. {"98", 152}, {"99", 153}, {"9A", 154}, {"9B", 155}, {"9C", 156}, {"9D", 157}, {"9E", 158}, {"9F", 159},
  60. {"A0", 160}, {"A1", 161}, {"A2", 162}, {"A3", 163}, {"A4", 164}, {"A5", 165}, {"A6", 166}, {"A7", 167},
  61. {"A8", 168}, {"A9", 169}, {"AA", 170}, {"AB", 171}, {"AC", 172}, {"AD", 173}, {"AE", 174}, {"AF", 175},
  62. {"B0", 176}, {"B1", 177}, {"B2", 178}, {"B3", 179}, {"B4", 180}, {"B5", 181}, {"B6", 182}, {"B7", 183},
  63. {"B8", 184}, {"B9", 185}, {"BA", 186}, {"BB", 187}, {"BC", 188}, {"BD", 189}, {"BE", 190}, {"BF", 191},
  64. {"C0", 192}, {"C1", 193}, {"C2", 194}, {"C3", 195}, {"C4", 196}, {"C5", 197}, {"C6", 198}, {"C7", 199},
  65. {"C8", 200}, {"C9", 201}, {"CA", 202}, {"CB", 203}, {"CC", 204}, {"CD", 205}, {"CE", 206}, {"CF", 207},
  66. {"D0", 208}, {"D1", 209}, {"D2", 210}, {"D3", 211}, {"D4", 212}, {"D5", 213}, {"D6", 214}, {"D7", 215},
  67. {"D8", 216}, {"D9", 217}, {"DA", 218}, {"DB", 219}, {"DC", 220}, {"DD", 221}, {"DE", 222}, {"DF", 223},
  68. {"E0", 224}, {"E1", 225}, {"E2", 226}, {"E3", 227}, {"E4", 228}, {"E5", 229}, {"E6", 230}, {"E7", 231},
  69. {"E8", 232}, {"E9", 233}, {"EA", 234}, {"EB", 235}, {"EC", 236}, {"ED", 237}, {"EE", 238}, {"EF", 239},
  70. {"F0", 240}, {"F1", 241}, {"F2", 242}, {"F3", 243}, {"F4", 244}, {"F5", 245}, {"F6", 246}, {"F7", 247},
  71. {"F8", 248}, {"F9", 249}, {"FA", 250}, {"FB", 251}, {"FC", 252}, {"FD", 253}, {"FE", 254}, {"FF", 255},
  72. };
  73. /// <summary>
  74. ///
  75. /// </summary>
  76. /// <param name="blockColumnIndex"></param>
  77. /// <returns></returns>
  78. public byte[] GetBlockByIndex(int blockColumnIndex)
  79. {
  80. lock (_cachedLock)
  81. {
  82. try
  83. {
  84. if (IsCached)
  85. {
  86. if (blockColumnIndex >= 0 && blockColumnIndex < _cachedRawData.Count)
  87. {
  88. return _cachedRawData[blockColumnIndex];
  89. }
  90. }
  91. else
  92. {
  93. return ConvertRawStringToBlockByteArray(_rawString.Split('|')[blockColumnIndex]);
  94. }
  95. }
  96. catch (Exception ex)
  97. { Debug.WriteLine($"{ex.Message}-{ex.StackTrace}"); }
  98. return null;
  99. }
  100. }
  101. /// <summary>
  102. ///
  103. /// </summary>
  104. public void CreateCache()
  105. {
  106. lock (_cachedLock)
  107. {
  108. try
  109. {
  110. if (IsCached)
  111. {
  112. return;
  113. }
  114. _cachedRawData.Clear();
  115. string[] strList = _rawString.Split('|');
  116. foreach (string strTemp in strList)
  117. {
  118. _cachedRawData.Add(ConvertRawStringToBlockByteArray(strTemp));
  119. }
  120. IsCached = true;
  121. _rawString = string.Empty;
  122. }
  123. catch (Exception ex)
  124. {
  125. Debug.WriteLine($"{ex.Message}-{ex.StackTrace}");
  126. IsCached = false;
  127. }
  128. }
  129. }
  130. /// <summary>
  131. ///
  132. /// </summary>
  133. /// <param name="strTemp"></param>
  134. /// <returns></returns>
  135. protected virtual byte[] ConvertRawStringToBlockByteArray(string strTemp)
  136. {
  137. byte[] newByteArray = new byte[strTemp.Length / 2];
  138. for (int i = 0; i < strTemp.Length / 2; i++)
  139. {
  140. newByteArray[i] = ToByteLookup(strTemp.Substring(i * 2, 2));
  141. }
  142. return newByteArray;
  143. }
  144. /// <summary>
  145. /// 轉換成位元組尋找表
  146. /// </summary>
  147. /// <param name="hexNumber">十六進位值</param>
  148. /// <returns>位元組</returns>
  149. private byte ToByteLookup(string hexNumber)
  150. {
  151. return ByteLookup[hexNumber];
  152. }
  153. }
  154. }