CRC 校验

原帖子地址:http://cuisuqiang.iteye.com/blog/1716654

CRC 校验

CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值