CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
        /// CRC算法参数模型解释:
        /// NAME:参数模型名称。
        ///WIDTH:宽度,即CRC比特数。
        /// POLY:生成项的简写,以16进制表示。例如:CRC-32即是0x04C11DB7,忽略了最高位的"1",即完整的生成项是0x104C11DB7。
        ///INIT:这是算法开始时寄存器(crc)的初始化预置值,十六进制表示。
        ///REFIN:待测数据的每个字节是否按位反转,True或False。
        /// REFOUT:在计算后之后,异或输出之前,整个数据是否按位反转,True或False。
        /// XOROUT:计算结果与此参数异或后得到最终的CRC值。

  1. /// **********************************************************************
  2. /// Name: CRC-4/ITU x4+x+1
  3. /// Poly: 0x03
  4. /// Init: 0x00
  5. /// Refin: true
  6. /// Refout: true
  7. /// Xorout: 0x00
  8. ///*************************************************************************
  9. public static byte[] Crc1(byte[] buffer, int start = , int len = )
  10. {
  11. if (buffer == null || buffer.Length == ) return null;
  12. if (start < ) return null;
  13. if (len == ) len = buffer.Length - start;
  14. int length = start + len;
  15. if (length > buffer.Length) return null;
  16. byte crc = ;// Initial value
  17. for (int i = start; i < length; i++)
  18. {
  19. crc ^= buffer[i];
  20. for (int j = ; j < ; j++)
  21. {
  22. if ((crc & ) > )
  23. crc = (byte)((crc >> ) ^ 0x0C);//0x0C = (reverse 0x03)>>(8-4)
  24. else
  25. crc = (byte)(crc >> );
  26. }
  27. }
  28. return new byte[] { crc };
  29. }
  30. /// **********************************************************************
  31. /// Name: CRC-5/EPC x5+x3+1
  32. /// Poly: 0x09
  33. /// Init: 0x09
  34. /// Refin: false
  35. /// Refout: false
  36. /// Xorout: 0x00
  37. ///*************************************************************************
  38. public static byte[] Crc2(byte[] buffer, int start = , int len = )
  39. {
  40. if (buffer == null || buffer.Length == ) return null;
  41. if (start < ) return null;
  42. if (len == ) len = buffer.Length - start;
  43. int length = start + len;
  44. if (length > buffer.Length) return null;
  45. byte crc = 0x48;// Initial value: 0x48 = 0x09<<(8-5)
  46. for (int i = start; i < length; i++)
  47. {
  48. crc ^= buffer[i];
  49. for (int j = ; j < ; j++)
  50. {
  51. if ((crc & 0x80) > )
  52. crc = (byte)((crc << ) ^ 0x48);// 0x48 = 0x09<<(8-5)
  53. else
  54. crc = (byte)(crc << );
  55. }
  56. }
  57. return new byte[] { (byte)(crc >> ) };
  58. }
  59. /// **********************************************************************
  60. /// Name: CRC-5/ITU x5+x4+x2+1
  61. /// Poly: 0x15
  62. /// Init: 0x00
  63. /// Refin: true
  64. /// Refout: true
  65. /// Xorout: 0x00
  66. ///*************************************************************************
  67. public static byte[] Crc3(byte[] buffer, int start = , int len = )
  68. {
  69. if (buffer == null || buffer.Length == ) return null;
  70. if (start < ) return null;
  71. if (len == ) len = buffer.Length - start;
  72. int length = start + len;
  73. if (length > buffer.Length) return null;
  74. byte crc = ;// Initial value
  75. for (int i = start; i < length; i++)
  76. {
  77. crc ^= buffer[i];
  78. for (int j = ; j < ; j++)
  79. {
  80. if ((crc & ) > )
  81. crc = (byte)((crc >> ) ^ 0x15);// 0x15 = (reverse 0x15)>>(8-5)
  82. else
  83. crc = (byte)(crc >> );
  84. }
  85. }
  86. return new byte[] { crc };
  87. }
  88. /// **********************************************************************
  89. /// Name: CRC-5/USB x5+x2+1
  90. /// Poly: 0x05
  91. /// Init: 0x1F
  92. /// Refin: true
  93. /// Refout: true
  94. /// Xorout: 0x1F
  95. ///*************************************************************************
  96. public static byte[] Crc4(byte[] buffer, int start = , int len = )
  97. {
  98. if (buffer == null || buffer.Length == ) return null;
  99. if (start < ) return null;
  100. if (len == ) len = buffer.Length - start;
  101. int length = start + len;
  102. if (length > buffer.Length) return null;
  103. byte crc = 0x1F;// Initial value
  104. for (int i = start; i < length; i++)
  105. {
  106. crc ^= buffer[i];
  107. for (int j = ; j < ; j++)
  108. {
  109. if ((crc & ) > )
  110. crc = (byte)((crc >> ) ^ 0x14);// 0x14 = (reverse 0x05)>>(8-5)
  111. else
  112. crc = (byte)(crc >> );
  113. }
  114. }
  115. return new byte[] {(byte)( crc ^ 0x1F) };
  116. }
  117. /// **********************************************************************
  118. /// Name: CRC-6/ITU x6+x+1
  119. /// Poly: 0x03
  120. /// Init: 0x00
  121. /// Refin: true
  122. /// Refout: true
  123. /// Xorout: 0x00
  124. ///*************************************************************************
  125. public static byte[] Crc5(byte[] buffer, int start = , int len = )
  126. {
  127. if (buffer == null || buffer.Length == ) return null;
  128. if (start < ) return null;
  129. if (len == ) len = buffer.Length - start;
  130. int length = start + len;
  131. if (length > buffer.Length) return null;
  132. byte crc = ;// Initial value
  133. for (int i = start; i < length; i++)
  134. {
  135. crc ^= buffer[i];
  136. for (int j = ; j < ; j++)
  137. {
  138. if ((crc & ) > )
  139. crc = (byte)((crc >> ) ^ 0x30);// 0x30 = (reverse 0x03)>>(8-6)
  140. else
  141. crc = (byte)(crc >> );
  142. }
  143. }
  144. return new byte[] { crc };
  145. }
  146. /// **********************************************************************
  147. /// Name: CRC-7/MMC x7+x3+1
  148. /// Poly: 0x09
  149. /// Init: 0x00
  150. /// Refin: false
  151. /// Refout: false
  152. /// Xorout: 0x00
  153. ///*************************************************************************
  154. public static byte[] Crc6(byte[] buffer, int start = , int len = )
  155. {
  156. if (buffer == null || buffer.Length == ) return null;
  157. if (start < ) return null;
  158. if (len == ) len = buffer.Length - start;
  159. int length = start + len;
  160. if (length > buffer.Length) return null;
  161. byte crc = ;// Initial value
  162. for (int i = start; i < length; i++)
  163. {
  164. crc ^= buffer[i];
  165. for (int j = ; j < ; j++)
  166. {
  167. if ((crc & 0x80) > )
  168. crc = (byte)((crc << ) ^ 0x12);// 0x12 = 0x09<<(8-7)
  169. else
  170. crc = (byte)(crc << );
  171. }
  172. }
  173. return new byte[] { (byte)(crc >> ) };
  174. }
  175. /// **********************************************************************
  176. /// Name: CRC8 x8+x2+x+1
  177. /// Poly: 0x07
  178. /// Init: 0x00
  179. /// Refin: false
  180. /// Refout: false
  181. /// Xorout: 0x00
  182. ///*************************************************************************
  183. public static byte[] Crc7(byte[] buffer, int start = , int len = )
  184. {
  185. if (buffer == null || buffer.Length == ) return null;
  186. if (start < ) return null;
  187. if (len == ) len = buffer.Length - start;
  188. int length = start + len;
  189. if (length > buffer.Length) return null;
  190. byte crc = ;// Initial value
  191. for (int i = start; i < length; i++)
  192. {
  193. crc ^= buffer[i];
  194. for (int j = ; j < ; j++)
  195. {
  196. if ((crc & 0x80) > )
  197. crc = (byte)((crc << ) ^ 0x07);
  198. else
  199. crc = (byte)(crc << );
  200. }
  201. }
  202. return new byte[] { crc };
  203. }
  204. /// **********************************************************************
  205. /// Name: CRC-8/ITU x8+x2+x+1
  206. /// Poly: 0x07
  207. /// Init: 0x00
  208. /// Refin: false
  209. /// Refout: false
  210. /// Xorout: 0x55
  211. ///*************************************************************************
  212. public static byte[] Crc8(byte[] buffer, int start = , int len = )
  213. {
  214. if (buffer == null || buffer.Length == ) return null;
  215. if (start < ) return null;
  216. if (len == ) len = buffer.Length - start;
  217. int length = start + len;
  218. if (length > buffer.Length) return null;
  219. byte crc = ;// Initial value
  220. for (int i = start; i < length; i++)
  221. {
  222. crc ^= buffer[i];
  223. for (int j = ; j < ; j++)
  224. {
  225. if ((crc & 0x80) > )
  226. crc = (byte)((crc << ) ^ 0x07);
  227. else
  228. crc = (byte)(crc << );
  229. }
  230. }
  231. return new byte[] { (byte)(crc ^ 0x55) };
  232. }
  233. /// **********************************************************************
  234. /// Name: CRC-8/MAXIM x8+x5+x4+1
  235. /// Poly: 0x31
  236. /// Init: 0x00
  237. /// Refin: true
  238. /// Refout: true
  239. /// Xorout: 0x00
  240. ///*************************************************************************
  241. public static byte[] Crc9(byte[] buffer, int start = , int len = )
  242. {
  243. if (buffer == null || buffer.Length == ) return null;
  244. if (start < ) return null;
  245. if (len == ) len = buffer.Length - start;
  246. int length = start + len;
  247. if (length > buffer.Length) return null;
  248. byte crc = ;// Initial value
  249. for (int i = start; i < length; i++)
  250. {
  251. crc ^= buffer[i];
  252. for (int j = ; j < ; j++)
  253. {
  254. if ((crc & ) > )
  255. crc = (byte)((crc >> ) ^ 0x8C);// 0x8C = reverse 0x31
  256. else
  257. crc = (byte)(crc >> );
  258. }
  259. }
  260. return new byte[] { crc };
  261. }
  262. /// **********************************************************************
  263. /// Name: CRC-8/ROHC x8+x2+x+1
  264. /// Poly: 0x07
  265. /// Init: 0xFF
  266. /// Refin: true
  267. /// Refout: true
  268. /// Xorout: 0x00
  269. ///*************************************************************************
  270. public static byte[] Crc10(byte[] buffer, int start = , int len = )
  271. {
  272. if (buffer == null || buffer.Length == ) return null;
  273. if (start < ) return null;
  274. if (len == ) len = buffer.Length - start;
  275. int length = start + len;
  276. if (length > buffer.Length) return null;
  277. byte crc = 0xFF;// Initial value
  278. for (int i = start; i < length; i++)
  279. {
  280. crc ^= buffer[i];
  281. for (int j = ; j < ; j++)
  282. {
  283. if ((crc & ) > )
  284. crc = (byte)((crc >> ) ^ 0xE0);// 0xE0 = reverse 0x07
  285. else
  286. crc = (byte)(crc >> );
  287. }
  288. }
  289. return new byte[] { crc };
  290. }
  291. /// Z1协议校验码计算
  292. static byte[] table = { 0x00, 0x1C, 0x38, 0x24, 0x70, 0x6C, 0x48, 0x54, 0xE0, 0xFC,
  293. 0xD8, 0xC4, 0x90, 0x8C, 0xA8, 0xB4, 0xDC, 0xC0, 0xE4, 0xF8,
  294. 0xAC, 0xB0, 0x94, 0x88, 0x3C, 0x20, 0x04, 0x18, 0x4C, 0x50,
  295. 0x74, 0x68, 0xA4, 0xB8, 0x9C, 0x80, 0xD4, 0xC8, 0xEC, 0xF0,
  296. 0x44, 0x58, 0x7C, 0x60, 0x34, 0x28, 0x0C, 0x10, 0x78, 0x64,
  297. 0x40, 0x5C, 0x08, 0x14, 0x30, 0x2C, 0x98, 0x84, 0xA0, 0xBC,
  298. 0xE8, 0xF4, 0xD0, 0xCC, 0x54, 0x48, 0x6C, 0x70, 0x24, 0x38,
  299. 0x1C, 0x00, 0xB4, 0xA8, 0x8C, 0x90, 0xC4, 0xD8, 0xFC, 0xE0,
  300. 0x88, 0x94, 0xB0, 0xAC, 0xF8, 0xE4, 0xC0, 0xDC, 0x68, 0x74,
  301. 0x50, 0x4C, 0x18, 0x04, 0x20, 0x3C, 0xF0, 0xEC, 0xC8, 0xD4,
  302. 0x80, 0x9C, 0xB8, 0xA4, 0x10, 0x0C, 0x28, 0x34, 0x60, 0x7C,
  303. 0x58, 0x44, 0x2C, 0x30, 0x14, 0x08, 0x5C, 0x40, 0x64, 0x78,
  304. 0xCC, 0xD0, 0xF4, 0xE8, 0xBC, 0xA0, 0x84, 0x98, 0xA8, 0xB4,
  305. 0x90, 0x8C, 0xD8, 0xC4, 0xE0, 0xFC, 0x48, 0x54, 0x70, 0x6C,
  306. 0x38, 0x24, 0x00, 0x1C, 0x74, 0x68, 0x4C, 0x50, 0x04, 0x18,
  307. 0x3C, 0x20, 0x94, 0x88, 0xAC, 0xB0, 0xE4, 0xF8, 0xDC, 0xC0,
  308. 0x0C, 0x10, 0x34, 0x28, 0x7C, 0x60, 0x44, 0x58, 0xEC, 0xF0,
  309. 0xD4, 0xC8, 0x9C, 0x80, 0xA4, 0xB8, 0xD0, 0xCC, 0xE8, 0xF4,
  310. 0xA0, 0xBC, 0x98, 0x84, 0x30, 0x2C, 0x08, 0x14, 0x40, 0x5C,
  311. 0x78, 0x64, 0xFC, 0xE0, 0xC4, 0xD8, 0x8C, 0x90, 0xB4, 0xA8,
  312. 0x1C, 0x00, 0x24, 0x38, 0x6C, 0x70, 0x54, 0x48, 0x20, 0x3C,
  313. 0x18, 0x04, 0x50, 0x4C, 0x68, 0x74, 0xC0, 0xDC, 0xF8, 0xE4,
  314. 0xB0, 0xAC, 0x88, 0x94, 0x58, 0x44, 0x60, 0x7C, 0x28, 0x34,
  315. 0x10, 0x0C, 0xB8, 0xA4, 0x80, 0x9C, 0xC8, 0xD4, 0xF0, 0xEC,
  316. 0x84, 0x98, 0xBC, 0xA0, 0xF4, 0xE8, 0xCC, 0xD0, 0x64, 0x78,
  317. 0x5C, 0x40, 0x14, 0x08, 0x2C, 0x30
  318. };
  319. public static byte[] Crc11(byte[] buffer, int start = , int len = )
  320. {
  321. if (buffer == null || buffer.Length == ) return null;
  322. if (start < ) return null;
  323. if (len == ) len = buffer.Length - start;
  324. int length = start + len;
  325. if (length > buffer.Length) return null;
  326. int i;
  327. byte crc = 0x00;
  328. int tableIndex;
  329. for (i = start; i < length; i++)
  330. {
  331. tableIndex = crc ^ (buffer[i] & 0xFF);
  332. crc = table[tableIndex];
  333. }
  334. return new byte[] { crc };
  335. }
  336. /// **********************************************************************
  337. /// Name: CRC-12 x16+x12+x5+1
  338. /// Poly: 0x80
  339. /// Init: 0x0000
  340. /// Refin: true
  341. /// Refout: true
  342. /// Xorout: 0x0000
  343. ///*************************************************************************
  344. public static byte[] Crc12(byte[] buffer, int start = , int len = )
  345. {
  346. if (buffer == null || buffer.Length == ) return null;
  347. if (start < ) return null;
  348. if (len == ) len = buffer.Length - start;
  349. int length = start + len;
  350. if (length > buffer.Length) return null;
  351. ushort crc = ;// Initial value
  352. short iQ = , iR = ;
  353. for (int i = start; i < length; i++)
  354. {
  355. // 多项式除法
  356. // 如果该位为1
  357. if ((buffer[i] & (0x80 >> iR)) > )
  358. {
  359. // 则在余数尾部添1否则添0
  360. crc |= 0x01;
  361. }
  362. // 如果12位除数中的最高位为1,则够除
  363. if (crc >= 0x1000)
  364. {
  365. crc ^= 0x180D;
  366. }
  367. crc <<= ;
  368. iR++;
  369. if ( == iR)
  370. {
  371. iR = ;
  372. iQ++;
  373. }
  374. }
  375. // 对后面添加的12个0做处理
  376. for (int i = ; i < ; i++)
  377. {
  378. if (crc >= 0x1000)
  379. {
  380. crc ^= 0x180D;
  381. }
  382. crc <<= ;
  383. }
  384. crc >>= ;
  385. byte[] ret = BitConverter.GetBytes(crc);
  386. Array.Reverse(ret);
  387. return ret;
  388. }
  389. /// **********************************************************************
  390. /// Name: CRC-16/CCITT x16+x12+x5+1
  391. /// Poly: 0x1021
  392. /// Init: 0x0000
  393. /// Refin: true
  394. /// Refout: true
  395. /// Xorout: 0x0000
  396. ///*************************************************************************
  397. public static byte[] Crc13(byte[] buffer, int start = , int len = )
  398. {
  399. if (buffer == null || buffer.Length == ) return null;
  400. if (start < ) return null;
  401. if (len == ) len = buffer.Length - start;
  402. int length = start + len;
  403. if (length > buffer.Length) return null;
  404. ushort crc = ;// Initial value
  405. for (int i = start; i < length; i++)
  406. {
  407. crc ^= buffer[i];
  408. for (int j = ; j < ; j++)
  409. {
  410. if ((crc & ) > )
  411. crc = (ushort)((crc >> ) ^ 0x8408);// 0x8408 = reverse 0x1021
  412. else
  413. crc = (ushort)(crc >> );
  414. }
  415. }
  416. byte[] ret = BitConverter.GetBytes(crc);
  417. Array.Reverse(ret);
  418. return ret;
  419. }
  420. /// **********************************************************************
  421. /// Name: CRC-16/CCITT FALSE x16+x12+x5+1
  422. /// Poly: 0x1021
  423. /// Init: 0xFFFF
  424. /// Refin: false
  425. /// Refout: false
  426. /// Xorout: 0x0000
  427. ///*************************************************************************
  428. public static byte[] Crc14(byte[] buffer, int start = , int len = )
  429. {
  430. if (buffer == null || buffer.Length == ) return null;
  431. if (start < ) return null;
  432. if (len == ) len = buffer.Length - start;
  433. int length = start + len;
  434. if (length > buffer.Length) return null;
  435. ushort crc = 0xFFFF;// Initial value
  436. for (int i = start; i < length; i++)
  437. {
  438. crc ^= (ushort)(buffer[i] << );
  439. for (int j = ; j < ; j++)
  440. {
  441. if ((crc & 0x8000) > )
  442. crc = (ushort)((crc << ) ^ 0x1021);
  443. else
  444. crc = (ushort)(crc << );
  445. }
  446. }
  447. byte[] ret = BitConverter.GetBytes(crc);
  448. Array.Reverse(ret);
  449. return ret;
  450. }
  451. /// **********************************************************************
  452. /// Name: CRC-16/DNP x16+x13+x12+x11+x10+x8+x6+x5+x2+1
  453. /// Poly: 0x3D65
  454. /// Init: 0x0000
  455. /// Refin: true
  456. /// Refout: true
  457. /// Xorout: 0xFFFF
  458. ///*************************************************************************
  459. public static byte[] Crc15(byte[] buffer, int start = , int len = )
  460. {
  461. if (buffer == null || buffer.Length == ) return null;
  462. if (start < ) return null;
  463. if (len == ) len = buffer.Length - start;
  464. int length = start + len;
  465. if (length > buffer.Length) return null;
  466. ushort crc = ;// Initial value
  467. for (int i = start; i < length; i++)
  468. {
  469. crc ^= buffer[i];
  470. for (int j = ; j < ; j++)
  471. {
  472. if ((crc & ) > )
  473. crc = (ushort)((crc >> ) ^ 0xA6BC);// 0xA6BC = reverse 0x3D65
  474. else
  475. crc = (ushort)(crc >> );
  476. }
  477. }
  478. byte[] ret = BitConverter.GetBytes((ushort)~crc);
  479. Array.Reverse(ret);
  480. return ret;
  481. }
  482. /// **********************************************************************
  483. /// Name: CRC-16/IBM x16+x15+x2+1
  484. /// Poly: 0x8005
  485. /// Init: 0x0000
  486. /// Refin: true
  487. /// Refout: true
  488. /// Xorout: 0x0000
  489. ///*************************************************************************
  490. public static byte[] Crc16(byte[] buffer, int start = , int len = )
  491. {
  492. if (buffer == null || buffer.Length == ) return null;
  493. if (start < ) return null;
  494. if (len == ) len = buffer.Length - start;
  495. int length = start + len;
  496. if (length > buffer.Length) return null;
  497. ushort crc = ;// Initial value
  498. for (int i = start; i < length; i++)
  499. {
  500. crc ^= buffer[i];
  501. for (int j = ; j < ; j++)
  502. {
  503. if ((crc & ) > )
  504. crc = (ushort)((crc >> ) ^ 0xA001);// 0xA001 = reverse 0x8005
  505. else
  506. crc = (ushort)(crc >> );
  507. }
  508. }
  509. byte[] ret = BitConverter.GetBytes(crc);
  510. Array.Reverse(ret);
  511. return ret;
  512. }
  513. /// **********************************************************************
  514. /// Name: CRC-16/MAXIM x16+x15+x2+1
  515. /// Poly: 0x8005
  516. /// Init: 0x0000
  517. /// Refin: true
  518. /// Refout: true
  519. /// Xorout: 0xFFFF
  520. ///*************************************************************************
  521. public static byte[] Crc17(byte[] buffer, int start = , int len = )
  522. {
  523. if (buffer == null || buffer.Length == ) return null;
  524. if (start < ) return null;
  525. if (len == ) len = buffer.Length - start;
  526. int length = start + len;
  527. if (length > buffer.Length) return null;
  528. ushort crc = ;// Initial value
  529. for (int i = start; i < length; i++)
  530. {
  531. crc ^= buffer[i];
  532. for (int j = ; j < ; j++)
  533. {
  534. if ((crc & ) > )
  535. crc = (ushort)((crc >> ) ^ 0xA001);// 0xA001 = reverse 0x8005
  536. else
  537. crc = (ushort)(crc >> );
  538. }
  539. }
  540. byte[] ret = BitConverter.GetBytes((ushort)~crc);
  541. Array.Reverse(ret);
  542. return ret;
  543. }
  544. /// **********************************************************************
  545. /// Name: CRC-16/MODBUS x16+x15+x2+1
  546. /// Poly: 0x8005
  547. /// Init: 0xFFFF
  548. /// Refin: true
  549. /// Refout: true
  550. /// Xorout: 0x0000
  551. ///*************************************************************************
  552. public static byte[] Crc18(byte[] buffer, int start = , int len = )
  553. {
  554. if (buffer == null || buffer.Length == ) return null;
  555. if (start < ) return null;
  556. if (len == ) len = buffer.Length - start;
  557. int length = start + len;
  558. if (length > buffer.Length) return null;
  559. ushort crc = 0xFFFF;// Initial value
  560. for (int i = start; i < length; i++)
  561. {
  562. crc ^= buffer[i];
  563. for (int j = ; j < ; j++)
  564. {
  565. if ((crc & ) > )
  566. crc = (ushort)((crc >> ) ^ 0xA001);// 0xA001 = reverse 0x8005
  567. else
  568. crc = (ushort)(crc >> );
  569. }
  570. }
  571. byte[] ret = BitConverter.GetBytes(crc);
  572. Array.Reverse(ret);
  573. return ret;
  574. }
  575. /// **********************************************************************
  576. /// Name: CRC-16/USB x16+x15+x2+1
  577. /// Poly: 0x8005
  578. /// Init: 0xFFFF
  579. /// Refin: true
  580. /// Refout: true
  581. /// Xorout: 0xFFFF
  582. ///*************************************************************************
  583. public static byte[] Crc19(byte[] buffer, int start = , int len = )
  584. {
  585. if (buffer == null || buffer.Length == ) return null;
  586. if (start < ) return null;
  587. if (len == ) len = buffer.Length - start;
  588. int length = start + len;
  589. if (length > buffer.Length) return null;
  590. ushort crc = 0xFFFF;// Initial value
  591. for (int i = start; i < length; i++)
  592. {
  593. crc ^= buffer[i];
  594. for (int j = ; j < ; j++)
  595. {
  596. if ((crc & ) > )
  597. crc = (ushort)((crc >> ) ^ 0xA001);// 0xA001 = reverse 0x8005
  598. else
  599. crc = (ushort)(crc >> );
  600. }
  601. }
  602. byte[] ret = BitConverter.GetBytes((ushort)~crc);
  603. Array.Reverse(ret);
  604. return ret;
  605. }
  606. /// **********************************************************************
  607. /// Name: CRC-16/X25 x16+x12+x5+1
  608. /// Poly: 0x1021
  609. /// Init: 0xFFFF
  610. /// Refin: true
  611. /// Refout: true
  612. /// Xorout: 0xFFFF
  613. ///*************************************************************************
  614. public static byte[] Crc20(byte[] buffer, int start = , int len = )
  615. {
  616. if (buffer == null || buffer.Length == ) return null;
  617. if (start < ) return null;
  618. if (len == ) len = buffer.Length - start;
  619. int length = start + len;
  620. if (length > buffer.Length) return null;
  621. ushort crc = 0xFFFF;// Initial value
  622. for (int i = start; i < length; i++)
  623. {
  624. crc ^= buffer[i];
  625. for (int j = ; j < ; j++)
  626. {
  627. if ((crc & ) > )
  628. crc = (ushort)((crc >> ) ^ 0x8408);// 0x8408 = reverse 0x1021
  629. else
  630. crc = (ushort)(crc >> );
  631. }
  632. }
  633. byte[] ret = BitConverter.GetBytes((ushort)~crc);
  634. Array.Reverse(ret);
  635. return ret;
  636. }
  637. /// **********************************************************************
  638. /// Name: CRC-16/XMODEM x16+x12+x5+1
  639. /// Poly: 0x1021
  640. /// Init: 0x0000
  641. /// Refin: false
  642. /// Refout: false
  643. /// Xorout: 0x0000
  644. ///*************************************************************************
  645. public static byte[] Crc21(byte[] buffer, int start = , int len = )
  646. {
  647. if (buffer == null || buffer.Length == ) return null;
  648. if (start < ) return null;
  649. if (len == ) len = buffer.Length - start;
  650. int length = start + len;
  651. if (length > buffer.Length) return null;
  652. ushort crc = ;// Initial value
  653. for (int i = start; i < length; i++)
  654. {
  655. crc ^= (ushort)(buffer[i] << );
  656. for (int j = ; j < ; j++)
  657. {
  658. if ((crc & 0x8000) > )
  659. crc = (ushort)((crc << ) ^ 0x1021);
  660. else
  661. crc = (ushort)(crc << );
  662. }
  663. }
  664. byte[] ret = BitConverter.GetBytes(crc);
  665. Array.Reverse(ret);
  666. return ret;
  667. }
  668. /// **********************************************************************
  669. /// Name: CRC32 x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
  670. /// Poly: 0x04C11DB7
  671. /// Init: 0xFFFFFFFF
  672. /// Refin: true
  673. /// Refout: true
  674. /// Xorout: 0xFFFFFFFF
  675. ///*************************************************************************
  676. public static byte[] Crc22(byte[] buffer, int start = , int len = )
  677. {
  678. if (buffer == null || buffer.Length == ) return null;
  679. if (start < ) return null;
  680. if (len == ) len = buffer.Length - start;
  681. int length = start + len;
  682. if (length > buffer.Length) return null;
  683. uint crc = 0xFFFFFFFF;// Initial value
  684. for (int i = start; i < length; i++)
  685. {
  686. crc ^= buffer[i];
  687. for (int j = ; j < ; j++)
  688. {
  689. if ((crc & ) > )
  690. crc = (crc >> ) ^ 0xEDB88320;// 0xEDB88320= reverse 0x04C11DB7
  691. else
  692. crc = crc >> ;
  693. }
  694. }
  695. byte[] ret = BitConverter.GetBytes(~crc);
  696. Array.Reverse(ret);
  697. return ret;
  698. }
  699. /// **********************************************************************
  700. /// Name: CRC32/MPEG-2 x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
  701. /// Poly: 0x04C11DB7
  702. /// Init: 0xFFFFFFFF
  703. /// Refin: false
  704. /// Refout: false
  705. /// Xorout: 0x00000000
  706. ///*************************************************************************
  707. public static byte[] Crc23(byte[] buffer, int start = , int len = )
  708. {
  709. if (buffer == null || buffer.Length == ) return null;
  710. if (start < ) return null;
  711. if (len == ) len = buffer.Length - start;
  712. int length = start + len;
  713. if (length > buffer.Length) return null;
  714. uint crc = 0xFFFFFFFF;// Initial value
  715. for (int i = start; i < length; i++)
  716. {
  717. crc ^= (uint)(buffer[i] << );
  718. for (int j = ; j < ; j++)
  719. {
  720. if ((crc & 0x80000000) > )
  721. crc = (crc << ) ^ 0x04C11DB7;
  722. else
  723. crc = crc << ;
  724. }
  725. }
  726. byte[] ret = BitConverter.GetBytes(crc);
  727. Array.Reverse(ret);
  728. return ret;
  729. }

纵向冗余校验(Longitudinal Redundancy Check,简称:LRC)是通信中常用的一种校验形式,也称LRC校验或纵向校验。 它是一种从纵向通道上的特定比特串产生校验比特的错误检测方法。在行列格式中(如磁带),LRC经常是与VRC一起使用,这样就会为每个字符校验码。在工业领域Modbus协议Ascii模式采用该算法。 LRC计算校验码,具体算法如下:
        /// 1、对需要校验的数据(2n个字符)两两组成一个16进制的数值求和。
        /// 2、将求和结果与256求模。
        /// 3、用256减去所得模值得到校验结果(另一种方法:将模值按位取反然后加1)。

  1. public static byte[] Lrc(byte[] buffer, int start = , int len = )
  2. {
  3. if (buffer == null || buffer.Length == ) return null;
  4. if (start < ) return null;
  5. if (len == ) len = buffer.Length - start;
  6. int length = start + len;
  7. if (length > buffer.Length) return null;
  8. byte lrc = ;// Initial value
  9. for (int i = start; i < len; i++)
  10. {
  11. lrc += buffer[i];
  12. }
  13. lrc = (byte)((lrc ^ 0xFF) + );
  14. return new byte[] { lrc };
  15. }

BCC(Block Check Character/信息组校验码),因校验码是将所有数据异或得出,故俗称异或校验。具体算法是:将每一个字节的数据(一般是两个16进制的字符)进行异或后即得到校验码。

  1. public static byte[] Bcc(byte[] buffer, int start = , int len = )
  2. {
  3. if (buffer == null || buffer.Length == ) return null;
  4. if (start < ) return null;
  5. if (len == ) len = buffer.Length - start;
  6. int length = start + len;
  7. if (length > buffer.Length) return null;
  8. byte bcc = ;// Initial value
  9. for (int i = start; i < len; i++)
  10. {
  11. bcc ^= buffer[i];
  12. }
  13. return new byte[] { bcc };
  14. }

检验和(checksum),在数据处理和数据通信领域中,用于校验目的地一组数据项的和。它通常是以十六进制为数制表示的形式。如果校验和的数值超过十六进制的FF,也就是255. 就要求其补码作为校验和。通常用来在通信中,尤其是远距离通信中保证数据的完整性和准确性。

  1. public static byte[] allAdd(byte[] buffer, int start = , int len = )
  2. {
  3. if (buffer == null || buffer.Length == ) return null;
  4. if (start < ) return null;
  5. if (len == ) len = buffer.Length - start;
  6. int length = start + len;
  7. if (length > buffer.Length) return null;
  8. byte bcc = ;// Initial value
  9. for (int i = start; i < len; i++)
  10. {
  11. bcc ^= buffer[i];
  12. }
  13. return new byte[] { bcc };
  14. }

用C#实现的几种常用数据校验方法整理(CRC校验;LRC校验;BCC校验;累加和校验)的更多相关文章

  1. 干货:结合Scikit-learn介绍几种常用的特征选择方法

    原文  http://dataunion.org/14072.html 主题 特征选择 scikit-learn 作者: Edwin Jarvis 特征选择(排序)对于数据科学家.机器学习从业者来说非 ...

  2. 结合Scikit-learn介绍几种常用的特征选择方法

    特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减 ...

  3. [转载]Scikit-learn介绍几种常用的特征选择方法

    #### [转载]原文地址:http://dataunion.org/14072.html 特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解 ...

  4. C#调试程序——断点+几种观察数据的方法

    目录 C#调试程序--断点+观察数据的方法 1.写本文的背景 2.调试与测试 3.断点调试 3.1 F10 3.2 F11 3.3 SHIFT+F11 4.监视 4.1 按照1方法打断点,单步调试. ...

  5. Content-Type的几种常用数据编码格式

    Content-Type,内容类型,一般是指网页中存在的Content-Type,ContentType属性指定请求和响应的HTTP内容类型.如果未指定 ContentType,默认为text/htm ...

  6. Content-Type:几种常用数据编码格式

    Content-Type: 用于定义用户的浏览器或相关设备如何显示将要加载的数据,或者如何处理将要加载的数据. 内容类型,一般指网页中存在的Content-Type,Content-Type属性指定请 ...

  7. VxWorks嵌入式系统几种常用的延时方法

    1 taskDelay     taskDelay(n)使调用该函数的任务延时n个tick(内核时钟周期).该任务在指定的时间内主动放弃CPU,除了taskDelay(0)专用 于任务调度(将CPU交 ...

  8. HTML 5 Web 存储提供了几种存储数据的方法

    localstorage存储对象分为两种: 1. sessionStorage: session即会话的意思,在这里的session是指用户浏览某个网站时,从进入网站到关闭网站这个时间段,sessio ...

  9. Hashtable几种常用的遍历方法

    Hashtable 在System.Collection是命名空间李Hashtable是程序员经常用到的类,它以快速检索著称,是研发人员开发当中不可缺少的利器. Hashtable表示键/值对的集合, ...

随机推荐

  1. L1005矩阵取数游戏

    #include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i, a, b) for ( ...

  2. redis缓存介绍以及常见问题浅析

    # 没缓存的日子: 对于web来说,是用户量和访问量支持项目技术的更迭和前进.随着服务用户提升.可能会出现一下的一些状况: 页面并发量和访问量并不多,mysql足以支撑自己逻辑业务的发展.那么其实可以 ...

  3. JVM总结(三)

    JVM总结(3)Class文件,类加载机制.编译过程 Java编译器先把Java代码编译为存储字节码的Class文件,再通过Class文件进行类加载. Class类文件的结构 Java编译器可以把Ja ...

  4. android——Fragment

    谷歌官方文档的介绍: https://developer.android.com/guide/components/fragments.html#Design Fragment 表示 Activity ...

  5. 依赖注入在 dotnet core 中实现与使用:1 基本概念

    关于 Microsoft Extension: DependencyInjection 的介绍已经很多,但是多数偏重于实现原理和一些特定的实现场景.作为 dotnet core 的核心基石,这里准备全 ...

  6. git 常规业务场景 使用

    一般每个开发者都会有个自己的分支,有个test分支,合并代码用,两条分支相互备份,就算merge的时候被覆盖,也不用担心 建立自己的分支 // 创建本地分支, git checkout -b dev_ ...

  7. springCould:使用Feign 实现声明式服务调用

    一.Spring Cloud Feign概念引入通过前面的随笔,我们了解如何通过Spring Cloud ribbon进行负责均衡,如何通过Spring Cloud Hystrix进行服务断路保护,两 ...

  8. Hibernate对象状态之间的神奇转换

    状态分类 在Hibernate框架中,为了管理持久化类,Hibernate将其分为了三个状态: 瞬时态(Transient Object) 持久态(Persistent Object) 脱管态(Det ...

  9. Flink中watermark为什么选择最小一条(源码分析)

    昨天在社区群看到有人问,为什么水印取最小的一条?这里分享一下自己的理解 首先水印一般是设置为:(事件时间 - 指定的值)  这里的作用是解决迟到数据的问题,从源码来看一下它如何解决的 先来看下wind ...

  10. silverlight中递归构造无限级树treeview+checkbox

    两个实体,其实一个实体也能构造出来,我这里是为了增加一个 checkbox //第一个实体 public class person { public int no { get; set; } publ ...