论坛首页 Java企业应用论坛

CRC校验---余式1021的CRC实现(一)

浏览 7739 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-06-11  

    关于CRC的校验原理及其他方面的知识网上有较为全面的文章,在JAVA程序开发中,尤其是通信程序开发时经常会遇到。通常可以根据算法计算获得,也可以通过利用预先计算好的CRC表查询计算获得,以下这段是关于CRC-ITU**(生成多项式为:x16+x12+x5+1简记式为1021)余式的CRC校验的JAVA程序。其它余式CRC算法原理类似,只需替换查询表即可,完整程序如下。

java 代码
  1. package com.java.test;   
  2.   
  3.   
  4. public class CRC16B {   
  5.  static final char TABLE1021[] = { /* CRC1021余式表 */  
  6.  0x00000x10210x20420x30630x40840x50a50x60c60x70e70x8108,   
  7.    0x91290xa14a0xb16b0xc18c0xd1ad0xe1ce0xf1ef0x1231,   
  8.    0x02100x32730x22520x52b50x42940x72f70x62d60x9339,   
  9.    0x83180xb37b0xa35a0xd3bd0xc39c0xf3ff0xe3de0x2462,   
  10.    0x34430x04200x14010x64e60x74c70x44a40x54850xa56a,   
  11.    0xb54b0x85280x95090xe5ee0xf5cf0xc5ac0xd58d0x3653,   
  12.    0x26720x16110x06300x76d70x66f60x56950x46b40xb75b,   
  13.    0xa77a0x97190x87380xf7df0xe7fe0xd79d0xc7bc0x48c4,   
  14.    0x58e50x68860x78a70x08400x18610x28020x38230xc9cc,   
  15.    0xd9ed0xe98e0xf9af0x89480x99690xa90a0xb92b0x5af5,   
  16.    0x4ad40x7ab70x6a960x1a710x0a500x3a330x2a120xdbfd,   
  17.    0xcbdc0xfbbf0xeb9e0x9b790x8b580xbb3b0xab1a0x6ca6,   
  18.    0x7c870x4ce40x5cc50x2c220x3c030x0c600x1c410xedae,   
  19.    0xfd8f0xcdec0xddcd0xad2a0xbd0b0x8d680x9d490x7e97,   
  20.    0x6eb60x5ed50x4ef40x3e130x2e320x1e510x0e700xff9f,   
  21.    0xefbe0xdfdd0xcffc0xbf1b0xaf3a0x9f590x8f780x9188,   
  22.    0x81a90xb1ca0xa1eb0xd10c0xc12d0xf14e0xe16f0x1080,   
  23.    0x00a10x30c20x20e30x50040x40250x70460x60670x83b9,   
  24.    0x93980xa3fb0xb3da0xc33d0xd31c0xe37f0xf35e0x02b1,   
  25.    0x12900x22f30x32d20x42350x52140x62770x72560xb5ea,   
  26.    0xa5cb0x95a80x85890xf56e0xe54f0xd52c0xc50d0x34e2,   
  27.    0x24c30x14a00x04810x74660x64470x54240x44050xa7db,   
  28.    0xb7fa0x87990x97b80xe75f0xf77e0xc71d0xd73c0x26d3,   
  29.    0x36f20x06910x16b00x66570x76760x46150x56340xd94c,   
  30.    0xc96d0xf90e0xe92f0x99c80x89e90xb98a0xa9ab0x5844,   
  31.    0x48650x78060x68270x18c00x08e10x38820x28a30xcb7d,   
  32.    0xdb5c0xeb3f0xfb1e0x8bf90x9bd80xabbb0xbb9a0x4a75,   
  33.    0x5a540x6a370x7a160x0af10x1ad00x2ab30x3a920xfd2e,   
  34.    0xed0f0xdd6c0xcd4d0xbdaa0xad8b0x9de80x8dc90x7c26,   
  35.    0x6c070x5c640x4c450x3ca20x2c830x1ce00x0cc10xef1f,   
  36.    0xff3e0xcf5d0xdf7c0xaf9b0xbfba0x8fd90x9ff80x6e17,   
  37.    0x7e360x4e550x5e740x2e930x3eb20x0ed10x1ef0 };   
  38.   
  39. public static char getCRC1021(byte b[], int len) {   
  40.   char crc = 0;   
  41.   byte hb = 0;   
  42.   int j = 0;   
  43.   int index;   
  44.   while (len-- != 0) {   
  45.    hb = (byte) (crc / 256); //以8位二进制数的形式暂存CRC的高8位   
  46.    index = ((hb ^ b[j]) & 0xff); //求得所查索引下标   
  47.    crc <<= 8// 左移8位,相当于CRC的低8位乘以   
  48.    crc ^= (TABLE1021[index]); // 高8位和当前字节相加后再查表求CRC ,再加上以前的CRC   
  49.    j++;   
  50.   }   
  51.   return (crc);   
  52.  }   
  53.   
  54. public static void main(String args[]) {   
  55.   byte tb[] = { (byte0xa10x02 };   
  56.   int a = getCRC1021(tb, 2);   
  57.   String str = Integer.toHexString(a).toUpperCase();   
  58.   System.err.println("" + str);   
  59.  }   
  60.   
  61. }   
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics