当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:12:00  来源:本站整理

用JAVA实现CRC16校验码[Java编程]

赞助商链接



  本文“用JAVA实现CRC16校验码[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

1.Design

2.Code

import java.io.IOException;
public class CRC16Checker {
       private static int[] index = new int[] { 16, 15, 2, 0 };
       private static int[] getBinary(String text) {
             StringBuffer num = new StringBuffer();
             String s; char ch;
             for (int i = 0; i < text.length(); i++) { // Change each char to binary code.
                   s = Integer.toBinaryString(text.charAt(i));
                   // If the code is less than 8 bit, make it as 8 bit.
                   for (int j = 8 - s.length(); j > 0; j--) num.append(0);
                   num.append(s);
             }
             int len = num.length();
             int[] code = new int[len];
             for (int i = 0; i < len; i++) // Change each 0/1 char to int.
               code[i] = Character.getNumericValue(num.charAt(i));
             return code;
       }
       private static String toHex(int[] num) {
             StringBuffer hex = new StringBuffer(num.length / 4);
             char[] ch = new char[4];
             for (int i = 0; i < num.length;) {
               // Change each 0/1 int to char.
                   ch[0] = Character.forDigit(num[i++], 2);
                   ch[1] = Character.forDigit(num[i++], 2);
                   ch[2] = Character.forDigit(num[i++], 2);
                   ch[3] = Character.forDigit(num[i++], 2);
                   // Change each 4-bit-code to hex number.
                   hex.append(Integer.toHexString(Integer.parseInt(String.valueOf(ch), 2)));
             }
             return hex.toString();
       }
// CRC codes main process
       public static int[] makeCRCCodes(int[] sourceCodes, int[] multinomial) {
             // The lenght of CRC code is N bits longer than source code. The codes
             // from 0 to sourceLength are same as the source. N bits after source
             // are the CRC codes. N is decided by the multinomial.
             // CRC码数组总长为原码长加上校验码码长.数组前部存放原码.校验码存放在数组
             // 最后的N位.校验码长度决意于生成多项式数组0位置上的元素.
             int sourceLength = sourceCodes.length;
             int codesLength = sourceLength + multinomial[0];
             int[] crcCodes = new int[codesLength];
             // Copy source code from 0 to sourceLength. 拷贝原码.
             System.arraycopy(sourceCodes, 0, crcCodes, 0, sourceLength);
             int temp, pos;
             // Division system. 除法器.
             for (int i = 0; i < sourceLength; i++) {
                   // Count value of the input adding the first register.
                   // 用第i位原码和第一个存放器值模二加.
                   temp = (crcCodes[sourceLength] + sourceCodes[i]) % 2;
                   // Move registers forwards from (1, length) to (0, length - 1).
                   // 第二个存放器及今后的全部存放器值前移1位.
                   System.arraycopy(
                         crcCodes, sourceLength + 1, crcCodes, sourceLength, multinomial[0] - 1);
                   // Set the last register with counted value.
                   // 最后一个存放器值存放计算好的输入值.
                   crcCodes[codesLength - 1] = temp;
                   // Count other registers. 按生成多项式的值算出位置,模二加出该存放器的值.
                   for (int j = index.length - 2; j > 0; j--) {
                         pos = codesLength - multinomial[j] - 1;
                         crcCodes[pos] = (crcCodes[pos] + temp) % 2;
                   }
             }
             return crcCodes;
       }
       public static void main(String[] args) throws IOException {
             System.out.print("Input hex data :");
             StringBuffer buf = new StringBuffer();
             char ch = (char) System.in.read();
             while (ch != '
' && ch != '
') {
                   buf.append(ch);
                   ch = (char) System.in.read();
             }
             // Get binary codes.
             int[] b = CRC16Checker.getBinary(buf.toString());
             // Make CRC codes.
             b = CRC16Checker.makeCRCCodes(b, CRC16Checker.index);
             // Output code as binary number.
             for (int i = 0; i < b.length;) {
                   for (int j = 0; j < 4; j++, i++) System.out.print(b[i]);
                   System.out.print(' ');
             }
             System.out.println();
             // Output code as hex number.
             System.out.println("The CRC16 code is :" + CRC16Checker.toHex(b));
       }
}

3. Test report :

Case : A (ASCII = 41)
Result : 410186
CRC bits : 0168 (0000 0001 1000 0110)
Run program :
Input hex data :A
0100 0001 0000 0001 1000 0110
The CRC16 code is :410186
Case : CRC16TEST (ASCII = 43 52 43 31 36 54 45 53 54)
Result : 455243313654455354fb66
CRC bits : fb66 (1111 1011 0110 0110)
Run program :
Input hex data :CRC16TEST
0100 0011 0101 0010 0100 0011 0011 0001 0011 0110 0101 0100 0100 0101 0101 0011 0101 0100 1111 1011 0110 0110
The CRC16 code is :435243313654455354fb66
Case : 5k (ASCII = 35 6b)
Result : 356b3f79
CRC bits : 3f79 (0011 1111 0111 1001)
Run program :
Input hex data :5k
0011 0101 0110 1011 0011 1111 0111 1001
The CRC16 code is :356b3f79


  以上是“用JAVA实现CRC16校验码[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 利用Javascript实现网页水印(非图片水印)
  • <b>如安在Oracle中利用Java存储历程</b>
  • 用Java实现自动在数据库表中生成ID号
  • 利用javascript获得浏览器中的星号密码办法
  • 用javabean来实现MySQL的分页显示
  • 用Java 1.1 AWT制作窗口和程序片
  • 用Java ME举行无线消息传送
  • <b>用Java筹划COM服务器</b>
  • 用Java筹划COM客户
  • <b>用Java程序生成文本的捷径</b>
  • 用Java实现FTP服务器办理策划
  • 用Java实现多线程服务器程序
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .