1. 程式人生 > >CRC16算法之一:CRC16-CCITT-FALSE算法的java實現

CRC16算法之一:CRC16-CCITT-FALSE算法的java實現

-c params ron 開始 return amp number urn 文章

CRC16算法系列文章

CRC16算法之一:CRC16-CCITT-FALSE算法的java實現

CRC16算法之二:CRC16-CCITT-XMODEM算法的java實現

CRC16算法之三:CRC16-CCITT-MODBUS算法的java實現

前言

JDK裏包含了CRC32的算法,但是沒有CRC16的,網上搜了一堆沒有找到想要的,索性自己實現

註意:CRC16算法分為很多種,本篇文章中,只講其中的一種:CRC16-CCITT-FALSE算法

CRC16算法系列之一:CRC16-CCITT-FALSE算法的java實現

功能

1、支持short類型

2、支持int類型

3、支持數組任意區域計算

實現

  1. /**
  2. * crc16-ccitt-false加密工具
  3. *
  4. * @author eguid
  5. *
  6. */
  7. public class CRC16 {
  8. /**
  9. * crc16-ccitt-false加/解密(四字節)
  10. *
  11. * @param bytes
  12. * @return
  13. */
  14. public static int crc16(byte[] bytes) {
  15. return crc16(bytes, bytes.length);
  16. }
  17. /**
  18. * crc16-ccitt-false加/解密(四字節)
  19. *
  20. * @param bytes -字節數組
  21. * @return
  22. */
  23. public static int crc16(byte[] bytes, int len) {
  24. int crc = 0xFFFF;
  25. for (int j = 0; j < len; j++) {
  26. crc = ((crc >>> 8) | (crc << 8)) & 0xffff;
  27. crc ^= (bytes[j] & 0xff);// byte to int, trunc sign
  28. crc ^= ((crc & 0xff) >> 4);
  29. crc ^= (crc << 12) & 0xffff;
  30. crc ^= ((crc & 0xFF) << 5) & 0xffff;
  31. }
  32. crc &= 0xffff;
  33. return crc;
  34. }
  35. /**
  36. * crc16-ccitt-false加/解密(四字節)
  37. *
  38. * @param bytes
  39. * @return
  40. */
  41. public static int crc16(byte[] bytes, int start, int len) {
  42. int crc = 0xFFFF;
  43. for (; start < len; start++) {
  44. crc = ((crc >>> 8) | (crc << 8)) & 0xffff;
  45. crc ^= (bytes[start] & 0xff);// byte to int, trunc sign
  46. crc ^= ((crc & 0xff) >> 4);
  47. crc ^= (crc << 12) & 0xffff;
  48. crc ^= ((crc & 0xFF) << 5) & 0xffff;
  49. }
  50. crc &= 0xffff;
  51. return crc;
  52. }
  53. /**
  54. * crc16-ccitt-false加/解密
  55. *
  56. * @param bytes
  57. * -字節數組
  58. * @return
  59. */
  60. public static short crc16_short(byte[] bytes) {
  61. return crc16_short(bytes, 0, bytes.length);
  62. }
  63. /**
  64. * crc16-ccitt-false加/解密(計算從0位置開始的len長度)
  65. *
  66. * @param bytes
  67. * -字節數組
  68. * @param len
  69. * -長度
  70. * @return
  71. */
  72. public static short crc16_short(byte[] bytes, int len) {
  73. return (short) crc16(bytes, len);
  74. }
  75. /**
  76. * crc16-ccitt-false加/解密(兩字節)
  77. *
  78. * @param bytes
  79. * @return
  80. */
  81. public static short crc16_short(byte[] bytes, int start, int len) {
  82. return (short) crc16(bytes, start, len);
  83. }
  84. }

CRC16算法之一:CRC16-CCITT-FALSE算法的java實現