Java CRC16校验

  1. /** 
  2.  * CRC16相关计算  
  3.  
  4.  * encode: utf-8 
  5.  *  
  6.  * @author dwb 
  7.  * @date 2017-5-25 
  8.  */  
  9. public class CRC16 {  
  10.     static byte[] crc16_tab_h = { (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x01, (byte0xC0,  
  11.             (byte0x80, (byte0x41, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x00, (byte0xC1,  
  12.             (byte0x81, (byte0x40, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x01, (byte0xC0,  
  13.             (byte0x80, (byte0x41, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x01, (byte0xC0,  
  14.             (byte0x80, (byte0x41, (byte0x00, (byte0xC1, (byte0x81, (byte0x40, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x01, (byte0xC0, (byte0x80, (byte0x41, (byte0x00, (byte0xC1, (byte0x81, (byte0x40 };  
  15.   
  16.     static byte[] crc16_tab_l = { (byte0x00, (byte0xC0, (byte0xC1, (byte0x01, (byte0xC3, (byte0x03, (byte0x02, (byte0xC2, (byte0xC6, (byte0x06, (byte0x07, (byte0xC7, (byte0x05, (byte0xC5, (byte0xC4, (byte0x04, (byte0xCC, (byte0x0C, (byte0x0D, (byte0xCD, (byte0x0F, (byte0xCF, (byte0xCE, (byte0x0E, (byte0x0A, (byte0xCA, (byte0xCB, (byte0x0B, (byte0xC9, (byte0x09, (byte0x08, (byte0xC8, (byte0xD8, (byte0x18, (byte0x19, (byte0xD9, (byte0x1B, (byte0xDB, (byte0xDA, (byte0x1A, (byte0x1E, (byte0xDE, (byte0xDF, (byte0x1F, (byte0xDD, (byte0x1D, (byte0x1C, (byte0xDC, (byte0x14, (byte0xD4, (byte0xD5, (byte0x15, (byte0xD7, (byte0x17, (byte0x16, (byte0xD6, (byte0xD2, (byte0x12,  
  17.             (byte0x13, (byte0xD3, (byte0x11, (byte0xD1, (byte0xD0, (byte0x10, (byte0xF0, (byte0x30, (byte0x31, (byte0xF1, (byte0x33, (byte0xF3, (byte0xF2, (byte0x32, (byte0x36, (byte0xF6, (byte0xF7, (byte0x37, (byte0xF5, (byte0x35, (byte0x34, (byte0xF4, (byte0x3C, (byte0xFC, (byte0xFD, (byte0x3D, (byte0xFF, (byte0x3F, (byte0x3E, (byte0xFE, (byte0xFA, (byte0x3A, (byte0x3B, (byte0xFB, (byte0x39, (byte0xF9, (byte0xF8, (byte0x38, (byte0x28, (byte0xE8, (byte0xE9, (byte0x29, (byte0xEB, (byte0x2B, (byte0x2A, (byte0xEA, (byte0xEE, (byte0x2E, (byte0x2F, (byte0xEF, (byte0x2D, (byte0xED, (byte0xEC, (byte0x2C, (byte0xE4, (byte0x24, (byte0x25, (byte0xE5, (byte0x27, (byte0xE7,  
  18.             (byte0xE6, (byte0x26, (byte0x22, (byte0xE2, (byte0xE3, (byte0x23, (byte0xE1, (byte0x21, (byte0x20, (byte0xE0, (byte0xA0, (byte0x60, (byte0x61, (byte0xA1, (byte0x63, (byte0xA3, (byte0xA2, (byte0x62, (byte0x66, (byte0xA6, (byte0xA7, (byte0x67, (byte0xA5, (byte0x65, (byte0x64, (byte0xA4, (byte0x6C, (byte0xAC, (byte0xAD, (byte0x6D, (byte0xAF, (byte0x6F, (byte0x6E, (byte0xAE, (byte0xAA, (byte0x6A, (byte0x6B, (byte0xAB, (byte0x69, (byte0xA9, (byte0xA8, (byte0x68, (byte0x78, (byte0xB8, (byte0xB9, (byte0x79, (byte0xBB, (byte0x7B, (byte0x7A, (byte0xBA, (byte0xBE, (byte0x7E, (byte0x7F, (byte0xBF, (byte0x7D, (byte0xBD, (byte0xBC, (byte0x7C, (byte0xB4, (byte0x74,  
  19.             (byte0x75, (byte0xB5, (byte0x77, (byte0xB7, (byte0xB6, (byte0x76, (byte0x72, (byte0xB2, (byte0xB3, (byte0x73, (byte0xB1, (byte0x71, (byte0x70, (byte0xB0, (byte0x50, (byte0x90, (byte0x91, (byte0x51, (byte0x93, (byte0x53, (byte0x52, (byte0x92, (byte0x96, (byte0x56, (byte0x57, (byte0x97, (byte0x55, (byte0x95, (byte0x94, (byte0x54, (byte0x9C, (byte0x5C, (byte0x5D, (byte0x9D, (byte0x5F, (byte0x9F, (byte0x9E, (byte0x5E, (byte0x5A, (byte0x9A, (byte0x9B, (byte0x5B, (byte0x99, (byte0x59, (byte0x58, (byte0x98, (byte0x88, (byte0x48, (byte0x49, (byte0x89, (byte0x4B, (byte0x8B, (byte0x8A, (byte0x4A, (byte0x4E, (byte0x8E, (byte0x8F, (byte0x4F, (byte0x8D, (byte0x4D,  
  20.             (byte0x4C, (byte0x8C, (byte0x44, (byte0x84, (byte0x85, (byte0x45, (byte0x87, (byte0x47, (byte0x46, (byte0x86, (byte0x82, (byte0x42, (byte0x43, (byte0x83, (byte0x41, (byte0x81, (byte0x80, (byte0x40 };  
  21.   
  22.     /** 
  23.      * 计算CRC16校验 
  24.      *  
  25.      * @param data 
  26.      *            需要计算的数组 
  27.      * @return CRC16校验值 
  28.      */  
  29.     public static int calcCrc16(byte[] data) {  
  30.         return calcCrc16(data, 0, data.length);  
  31.     }  
  32.   
  33.     /** 
  34.      * 计算CRC16校验 
  35.      *  
  36.      * @param data 
  37.      *            需要计算的数组 
  38.      * @param offset 
  39.      *            起始位置 
  40.      * @param len 
  41.      *            长度 
  42.      * @return CRC16校验值 
  43.      */  
  44.     public static int calcCrc16(byte[] data, int offset, int len) {  
  45.         return calcCrc16(data, offset, len, 0xffff);  
  46.     }  
  47.   
  48.     /** 
  49.      * 计算CRC16校验 
  50.      *  
  51.      * @param data 
  52.      *            需要计算的数组 
  53.      * @param offset 
  54.      *            起始位置 
  55.      * @param len 
  56.      *            长度 
  57.      * @param preval 
  58.      *            之前的校验值 
  59.      * @return CRC16校验值 
  60.      */  
  61.     public static int calcCrc16(byte[] data, int offset, int len, int preval) {  
  62.         int ucCRCHi = (preval & 0xff00) >> 8;  
  63.         int ucCRCLo = preval & 0x00ff;  
  64.         int iIndex;  
  65.         for (int i = 0; i < len; ++i) {  
  66.             iIndex = (ucCRCLo ^ data[offset + i]) & 0x00ff;  
  67.             ucCRCLo = ucCRCHi ^ crc16_tab_h[iIndex];  
  68.             ucCRCHi = crc16_tab_l[iIndex];  
  69.         }  
  70.         return ((ucCRCHi & 0x00ff) << 8) | (ucCRCLo & 0x00ff) & 0xffff;  
  71.     }  
  72.   
  73.     // 测试  
  74.     public static void main(String[] args) {  
  75.         // 0x02 05 00 03 FF 00 , crc16=7C 09  
  76.         int crc = CRC16.calcCrc16(new byte[] { 0x020x050x000x03, (byte0xff0x00 });  
  77.         System.out.println(String.format("0x%04x", crc));  
  78.     }  
  79. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值