分享

java实现CRC校验码

 宇宙之窗 2014-04-18
        
  1. public class CRC {  
  2.     /** 
  3.      * CRC-CCITT(Kermit)验证模式 
  4.      * @param str  
  5.      * @return 
  6.      */  
  7.     public String CRC_CCITT_Kermit(String str) {  
  8.         int j, b, rrrc, c, i;  
  9.         String tmpBalance;  
  10.         int k;  
  11.         rrrc = 0;  
  12.         tmpBalance = str;  
  13.         int tmpInt, CharInt;  
  14.         String tmpChar, tmpStr;  
  15.         tmpStr = "";  
  16.         int High;  
  17.         int Low;  
  18.   
  19.     for (j = 1; j <= 3; j++) {  
  20.   
  21.             if (Character.isDigit(tmpBalance.charAt(2 * j - 2))) {  
  22.                 High = Integer.parseInt(tmpBalance.charAt(2 * j - 2) + "");  
  23.   
  24.             } else {  
  25.                 High = 0;  
  26.   
  27.             }  
  28.             if (Character.isDigit(tmpBalance.charAt(2 * j - 1))) {  
  29.                 Low = Integer.parseInt(tmpBalance.charAt(2 * j - 1) + "");  
  30.   
  31.             } else {  
  32.   
  33.                 Low = 0;  
  34.             }  
  35.   
  36.             High = (High & 0xff) << 4;  
  37.   
  38.             High = High | Low;  
  39.   
  40.             k = High;  
  41.   
  42.             for (i = 1; i <= 8; i++) {  
  43.                 c = rrrc & 1;  
  44.                 rrrc = rrrc >> 1;  
  45.                 if ((k & 1) != 0) {  
  46.                     rrrc = rrrc | 0x8000;  
  47.   
  48.                 }  
  49.                 if (c != 0) {  
  50.   
  51.                     rrrc = rrrc ^ 0x8408;  
  52.                 }  
  53.   
  54.                 k = k >> 1;  
  55.             }  
  56.         }  
  57.         for (i = 1; i <= 16; i++) {  
  58.             c = rrrc & 1;  
  59.             rrrc = rrrc >> 1;  
  60.   
  61.             if (c != 0) {  
  62.   
  63.                 rrrc = rrrc ^ 0x8408;  
  64.             }  
  65.   
  66.         }  
  67.         c = rrrc >> 8;  
  68.         b = rrrc << 8;  
  69.         rrrc = c | b;  
  70.         tmpInt = rrrc;  
  71.         tmpStr = "";  
  72.         for (i = 1; i <= 4; i++) {  
  73.             tmpChar = "";  
  74.             CharInt = tmpInt % 16;  
  75.             if (CharInt > 9) {  
  76.                 switch (CharInt) {  
  77.                 case 10:  
  78.                     tmpChar = "A";  
  79.                     break;  
  80.                 case 11:  
  81.   
  82.                     tmpChar = "B";  
  83.                     break;  
  84.                 case 12:  
  85.                     tmpChar = "C";  
  86.                     break;  
  87.   
  88.                 case 13:  
  89.   
  90.                     tmpChar = "D";  
  91.                     break;  
  92.   
  93.                 case 14:  
  94.   
  95.                     tmpChar = "E";  
  96.                     break;  
  97.   
  98.                 case 15:  
  99.   
  100.                     tmpChar = "F";  
  101.                     break;  
  102.   
  103.                 }  
  104.             } else {  
  105.   
  106.                 tmpChar = Integer.toString(CharInt);  
  107.             }  
  108.   
  109.             tmpInt = tmpInt / 16;  
  110.             tmpStr = tmpChar + tmpStr;  
  111.   
  112.         }  
  113.   
  114.         System.out.println("tmpStr:" + tmpStr);  
  115.   
  116.         return tmpStr;  
  117.   
  118.     }  
  119.       
  120.     /** 
  121.      * CRC-CCITT(XModem) 
  122.      * CRC-CCITT(0xFFFF)   
  123.      * CRC-CCITT(0x1D0F)  
  124.      * 校验模式 
  125.      * @param flag< XModem(flag=1) 0xFFFF(flag=2) 0x1D0F(flag=3)> 
  126.      * @param str 
  127.      * @return 
  128.      */  
  129.     public String  CRC_CCITT( int flag,String str) {   
  130.         int crc = 0x00;          // initial value   
  131.         int polynomial = 0x1021;     
  132.         byte[] bytes=str.getBytes();  
  133.           
  134.         switch(flag){  
  135.         case 1:  
  136.             crc=0x00;  
  137.             break;  
  138.         case 2:  
  139.             crc=0xFFFF;  
  140.             break;  
  141.         case 3:  
  142.             crc=0x1D0F;  
  143.             break;  
  144.           
  145.         }  
  146.         for (int index = 0 ; index< bytes.length; index++) {  
  147.             byte b = bytes[index];  
  148.             for (int i = 0; i < 8; i++) {  
  149.                 boolean bit = ((b   >> (7-i) & 1) == 1);  
  150.                 boolean c15 = ((crc >> 15    & 1) == 1);  
  151.                 crc <<= 1;  
  152.                 if (c15 ^ bit) crc ^= polynomial;  
  153.              }  
  154.         }  
  155.         crc &= 0xffff;  
  156.         str = Integer.toHexString(crc);  
  157.         return str;  
  158.           
  159.     }  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章