CRC16算法之一:CRC16-CCITT-FALSE算法的java实现

Posted eguid

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CRC16算法之一:CRC16-CCITT-FALSE算法的java实现相关的知识,希望对你有一定的参考价值。

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. /**
  10. * crc16-ccitt-false加/解密(四字节)
  11. *
  12. * @param bytes
  13. * @return
  14. */
  15. public static int crc16(byte[] bytes) {
  16. return crc16(bytes, bytes.length);
  17. }
  18.  
  19. /**
  20. * crc16-ccitt-false加/解密(四字节)
  21. *
  22. * @param bytes -字节数组
  23. * @return
  24. */
  25. public static int crc16(byte[] bytes, int len) {
  26. int crc = 0xFFFF;
  27. for (int j = 0; j < len; j++) {
  28. crc = ((crc >>> 8) | (crc << 8)) & 0xffff;
  29. crc ^= (bytes[j] & 0xff);// byte to int, trunc sign
  30. crc ^= ((crc & 0xff) >> 4);
  31. crc ^= (crc << 12) & 0xffff;
  32. crc ^= ((crc & 0xFF) << 5) & 0xffff;
  33. }
  34. crc &= 0xffff;
  35. return crc;
  36. }
  37.  
  38. /**
  39. * crc16-ccitt-false加/解密(四字节)
  40. *
  41. * @param bytes
  42. * @return
  43. */
  44. public static int crc16(byte[] bytes, int start, int len) {
  45. int crc = 0xFFFF;
  46. for (; start < len; start++) {
  47. crc = ((crc >>> 8) | (crc << 8)) & 0xffff;
  48. crc ^= (bytes[start] & 0xff);// byte to int, trunc sign
  49. crc ^= ((crc & 0xff) >> 4);
  50. crc ^= (crc << 12) & 0xffff;
  51. crc ^= ((crc & 0xFF) << 5) & 0xffff;
  52. }
  53. crc &= 0xffff;
  54. return crc;
  55. }
  56.  
  57. /**
  58. * crc16-ccitt-false加/解密
  59. *
  60. * @param bytes
  61. * -字节数组
  62. * @return
  63. */
  64. public static short crc16_short(byte[] bytes) {
  65. return crc16_short(bytes, 0, bytes.length);
  66. }
  67.  
  68. /**
  69. * crc16-ccitt-false加/解密(计算从0位置开始的len长度)
  70. *
  71. * @param bytes
  72. * -字节数组
  73. * @param len
  74. * -长度
  75. * @return
  76. */
  77. public static short crc16_short(byte[] bytes, int len) {
  78. return (short) crc16(bytes, len);
  79. }
  80.  
  81. /**
  82. * crc16-ccitt-false加/解密(两字节)
  83. *
  84. * @param bytes
  85. * @return
  86. */
  87. public static short crc16_short(byte[] bytes, int start, int len) {
  88. return (short) crc16(bytes, start, len);
  89. }
  90. }

 

以上是关于CRC16算法之一:CRC16-CCITT-FALSE算法的java实现的主要内容,如果未能解决你的问题,请参考以下文章

CRC16算法之三:CRC16-CCITT-MODBUS算法的java实现

CRC-16/MODBUS 算法

Modbus总线CRC16效验算法C语言

java CRC16 算法

求助crc32的原理

crc16校验的c语言程序