BCH15_5.cs
上传用户:tjjgrl
上传日期:2019-04-04
资源大小:1010k
文件大小:5k
源码类别:

电子政务应用

开发平台:

C#

  1. using System;
  2. namespace ThoughtWorks.QRCode.Codec.Ecc
  3. {
  4. public class BCH15_5
  5. {
  6.         internal int[][] gf16;
  7.         internal bool[] recieveData;
  8.         internal int numCorrectedError;
  9. virtual public int NumCorrectedError
  10. {
  11. get
  12. {
  13. return numCorrectedError;
  14. }
  15. }
  16. public BCH15_5(bool[] source)
  17. {
  18. gf16 = createGF16();
  19. recieveData = source;
  20. }
  21. public virtual bool[] correct()
  22. {
  23. int[] s = calcSyndrome(recieveData);
  24. int[] errorPos = detectErrorBitPosition(s);
  25. bool[] output = correctErrorBit(recieveData, errorPos);
  26. return output;
  27. }
  28. internal virtual int[][] createGF16()
  29. {
  30. gf16 = new int[16][];
  31. for (int i = 0; i < 16; i++)
  32. {
  33. gf16[i] = new int[4];
  34. }
  35. int[] seed = new int[]{1, 1, 0, 0};
  36. for (int i = 0; i < 4; i++)
  37. gf16[i][i] = 1;
  38. for (int i = 0; i < 4; i++)
  39. gf16[4][i] = seed[i];
  40. for (int i = 5; i < 16; i++)
  41. {
  42. for (int j = 1; j < 4; j++)
  43. {
  44. gf16[i][j] = gf16[i - 1][j - 1];
  45. }
  46. if (gf16[i - 1][3] == 1)
  47. {
  48. for (int j = 0; j < 4; j++)
  49. gf16[i][j] = (gf16[i][j] + seed[j]) % 2;
  50. }
  51. }
  52. return gf16;
  53. }
  54. internal virtual int searchElement(int[] x)
  55. {
  56. int k;
  57. for (k = 0; k < 15; k++)
  58. {
  59. if (x[0] == gf16[k][0] && x[1] == gf16[k][1] && x[2] == gf16[k][2] && x[3] == gf16[k][3])
  60. break;
  61. }
  62. return k;
  63. }
  64. internal virtual int[] getCode(int input)
  65. {
  66. int[] f = new int[15];
  67. int[] r = new int[8];
  68. for (int i = 0; i < 15; i++)
  69. {
  70. //1 + x + x^3
  71. int w1, w2;
  72. int yin;
  73. w1 = r[7];
  74. if (i < 7)
  75. {
  76. yin = (input >> (6 - i)) % 2;
  77. w2 = (yin + w1) % 2;
  78. }
  79. else
  80. {
  81. yin = w1;
  82. w2 = 0;
  83. }
  84. r[7] = (r[6] + w2) % 2;
  85. r[6] = (r[5] + w2) % 2;
  86. r[5] = r[4];
  87. r[4] = (r[3] + w2) % 2;
  88. r[3] = r[2];
  89. r[2] = r[1];
  90. r[1] = r[0];
  91. r[0] = w2;
  92. f[14 - i] = yin;
  93. }
  94. return f;
  95. }
  96. internal static String[] bitName = new String[]{"c0", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "d0", "d1", "d2", "d3", "d4"};
  97. internal virtual int addGF(int arg1, int arg2)
  98. {
  99. int[] p = new int[4];
  100. for (int m = 0; m < 4; m++)
  101. {
  102. int w1 = (arg1 < 0 || arg1 >= 15)?0:gf16[arg1][m];
  103. int w2 = (arg2 < 0 || arg2 >= 15)?0:gf16[arg2][m];
  104. p[m] = (w1 + w2) % 2;
  105. }
  106. return searchElement(p);
  107. }
  108. internal virtual int[] calcSyndrome(bool[] y)
  109. {
  110. int[] s = new int[5];
  111. int[] p = new int[4];
  112. int k;
  113. for (k = 0; k < 15; k++)
  114. {
  115. if (y[k] == true)
  116. for (int m = 0; m < 4; m++)
  117. p[m] = (p[m] + gf16[k][m]) % 2;
  118. }
  119. k = searchElement(p);
  120. s[0] = (k >= 15)?- 1:k;
  121. p = new int[4];
  122. for (k = 0; k < 15; k++)
  123. {
  124. if (y[k] == true)
  125. for (int m = 0; m < 4; m++)
  126. p[m] = (p[m] + gf16[(k * 3) % 15][m]) % 2;
  127. }
  128. k = searchElement(p);
  129. s[2] = (k >= 15)?- 1:k;
  130. p = new int[4];
  131. for (k = 0; k < 15; k++)
  132. {
  133. if (y[k] == true)
  134. for (int m = 0; m < 4; m++)
  135. p[m] = (p[m] + gf16[(k * 5) % 15][m]) % 2;
  136. }
  137. k = searchElement(p);
  138. s[4] = (k >= 15)?- 1:k;
  139. return s;
  140. }
  141. internal virtual int[] calcErrorPositionVariable(int[] s)
  142. {
  143. int[] e = new int[4];
  144. // calc σ1
  145. e[0] = s[0];
  146. //Console.out.println("σ1 = " + String.valueOf(e[0]));
  147. // calc σ2
  148. int t = (s[0] + s[1]) % 15;
  149. int mother = addGF(s[2], t);
  150. mother = (mother >= 15)?- 1:mother;
  151. t = (s[2] + s[1]) % 15;
  152. int child = addGF(s[4], t);
  153. child = (child >= 15)?- 1:child;
  154. e[1] = (child < 0 && mother < 0)?- 1:(child - mother + 15) % 15;
  155. // calc σ3
  156. t = (s[1] + e[0]) % 15;
  157. int t1 = addGF(s[2], t);
  158. t = (s[0] + e[1]) % 15;
  159. e[2] = addGF(t1, t);
  160. return e;
  161. }
  162. internal virtual int[] detectErrorBitPosition(int[] s)
  163. {
  164. int[] e = calcErrorPositionVariable(s);
  165. int[] errorPos = new int[4];
  166. if (e[0] == - 1)
  167. {
  168. //Console.out.println("No errors.");               
  169. return errorPos;
  170. }
  171. else if (e[1] == - 1)
  172. {
  173. errorPos[0] = 1;
  174. errorPos[1] = e[0];
  175. return errorPos;
  176. }
  177. int x3, x2, x1;
  178. int t, t1, t2, anError;
  179. //error detection
  180. for (int i = 0; i < 15; i++)
  181. {
  182. x3 = (i * 3) % 15;
  183. x2 = (i * 2) % 15;
  184. x1 = i;
  185. //p = new int[4];
  186. t = (e[0] + x2) % 15;
  187. t1 = addGF(x3, t);
  188. t = (e[1] + x1) % 15;
  189. t2 = addGF(t, e[2]);
  190. anError = addGF(t1, t2);
  191. if (anError >= 15)
  192. {
  193. errorPos[0]++;
  194. errorPos[errorPos[0]] = i;
  195. }
  196. }
  197. return errorPos;
  198. }
  199. internal virtual bool[] correctErrorBit(bool[] y, int[] errorPos)
  200. {
  201. for (int i = 1; i <= errorPos[0]; i++)
  202. y[errorPos[i]] = !y[errorPos[i]];
  203. numCorrectedError = errorPos[0];
  204. return y;
  205. }
  206. }
  207. }