java中CRC 校验参考代码

CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import  java.util.Arrays;
/**
  * @说明 CRC校验类
  * @author cuisuqiang
  * @version 1.0
  * @since
  */
public  class  CRCCheck {
  
  public  static  void  main(String[] args) {
   byte [] btm =  new  byte [] {  12 13 1 0 0 1 0 31 , - 19 0 8 ,
     0 1  };
   byte [] btl = CRCCheck.getCRCByteValue(btm);
   System.out.println(Arrays.toString(btl));
  }
  /**
   * 入口方法
   * @param bt 需要校验的字节流
   * @return
   */
  public  static  byte [] getCRCByteValue( byte [] bt){
   char  ch = caluCRC(bt);
   return  charToByte(ch);
  }
  public  static  char [] crc_tb = {  0x0000 0x1021 0x2042 0x3063 0x4084 ,
    0x50a5 0x60c6 0x70e7 0x8108 0x9129 0xa14a 0xb16b 0xc18c ,
    0xd1ad 0xe1ce 0xf1ef 0x1231 0x0210 0x3273 0x2252 0x52b5 ,
    0x4294 0x72f7 0x62d6 0x9339 0x8318 0xb37b 0xa35a 0xd3bd ,
    0xc39c 0xf3ff 0xe3de 0x2462 0x3443 0x0420 0x1401 0x64e6 ,
    0x74c7 0x44a4 0x5485 0xa56a 0xb54b 0x8528 0x9509 0xe5ee ,
    0xf5cf 0xc5ac 0xd58d 0x3653 0x2672 0x1611 0x0630 0x76d7 ,
    0x66f6 0x5695 0x46b4 0xb75b 0xa77a 0x9719 0x8738 0xf7df ,
    0xe7fe 0xd79d 0xc7bc 0x48c4 0x58e5 0x6886 0x78a7 0x0840 ,
    0x1861 0x2802 0x3823 0xc9cc 0xd9ed 0xe98e 0xf9af 0x8948 ,
    0x9969 0xa90a 0xb92b 0x5af5 0x4ad4 0x7ab7 0x6a96 0x1a71 ,
    0x0a50 0x3a33 0x2a12 0xdbfd 0xcbdc 0xfbbf 0xeb9e 0x9b79 ,
    0x8b58 0xbb3b 0xab1a 0x6ca6 0x7c87 0x4ce4 0x5cc5 0x2c22 ,
    0x3c03 0x0c60 0x1c41 0xedae 0xfd8f 0xcdec 0xddcd 0xad2a ,
    0xbd0b 0x8d68 0x9d49 0x7e97 0x6eb6 0x5ed5 0x4ef4 0x3e13 ,
    0x2e32 0x1e51 0x0e70 0xff9f 0xefbe 0xdfdd 0xcffc 0xbf1b ,
    0xaf3a 0x9f59 0x8f78 0x9188 0x81a9 0xb1ca 0xa1eb 0xd10c ,
    0xc12d 0xf14e 0xe16f 0x1080 0x00a1 0x30c2 0x20e3 0x5004 ,
    0x4025 0x7046 0x6067 0x83b9 0x9398 0xa3fb 0xb3da 0xc33d ,
    0xd31c 0xe37f 0xf35e 0x02b1 0x1290 0x22f3 0x32d2 0x4235 ,
    0x5214 0x6277 0x7256 0xb5ea 0xa5cb 0x95a8 0x8589 0xf56e ,
    0xe54f 0xd52c 0xc50d 0x34e2 0x24c3 0x14a0 0x0481 0x7466 ,
    0x6447 0x5424 0x4405 0xa7db 0xb7fa 0x8799 0x97b8 0xe75f ,
    0xf77e 0xc71d 0xd73c 0x26d3 0x36f2 0x0691 0x16b0 0x6657 ,
    0x7676 0x4615 0x5634 0xd94c 0xc96d 0xf90e 0xe92f 0x99c8 ,
    0x89e9 0xb98a 0xa9ab 0x5844 0x4865 0x7806 0x6827 0x18c0 ,
    0x08e1 0x3882 0x28a3 0xcb7d 0xdb5c 0xeb3f 0xfb1e 0x8bf9 ,
    0x9bd8 0xabbb 0xbb9a 0x4a75 0x5a54 0x6a37 0x7a16 0x0af1 ,
    0x1ad0 0x2ab3 0x3a92 0xfd2e 0xed0f 0xdd6c 0xcd4d 0xbdaa ,
    0xad8b 0x9de8 0x8dc9 0x7c26 0x6c07 0x5c64 0x4c45 0x3ca2 ,
    0x2c83 0x1ce0 0x0cc1 0xef1f 0xff3e 0xcf5d 0xdf7c 0xaf9b ,
    0xbfba 0x8fd9 0x9ff8 0x6e17 0x7e36 0x4e55 0x5e74 0x2e93 ,
    0x3eb2 0x0ed1 0x1ef0  };
  /**
   * 获得CRC验证码
   */
  public  static  char  caluCRC( byte [] pByte) {
   int  len = pByte.length;
   char  crc;
   byte  da;
   crc =  0x0 ;
   int  i =  0 ;
   while  (len-- !=  0 ) {
    da = ( byte ) (crc /  256 );
    crc <<=  8 ;
    int  num = da ^ pByte[i];
    if  (num <  0 )
     num +=  256 ;
    crc ^= crc_tb[num];
    ++i;
   }
   return  crc;
  }
  /**
   * char 转byte
   */
  public  static  byte [] charToByte( char  c) {
   byte [] b =  new  byte [ 2 ];
   b[ 0 ] = ( byte ) ((c &  0xFF00 ) >>  8 );
   b[ 1 ] = ( byte ) (c &  0xFF );
   return  b;
  }
  
}

一般在网络通信中用于包的完整性验证。


原文地址:http://www.javacui.com/Theory/218.html



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值