`
c86423908
  • 浏览: 3807 次
  • 性别: Icon_minigender_1
  • 来自: 常州
社区版块
存档分类
最新评论

java CRC16验证

阅读更多

直接上代码,已测:

package com.aisuo.cn.run;

public class CRC16M {

    private static final String HEXES = "0123456789ABCDEF";
    byte uchCRCHi = (byte) 0xFF;
    byte uchCRCLo = (byte) 0xFF;
    private static byte[] auchCRCHi = { 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
            (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
            (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
            (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
            (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
            (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
            (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
            (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
            (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
            (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
            (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
            (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
            (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
            (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
            (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
            (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
            (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
            (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
            (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
            (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
            (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
            (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
            (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
            (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
            (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
            (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
            (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
            (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
            (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
            (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
            (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
            (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
            (byte) 0x81, (byte) 0x40 };
    private static byte[] auchCRCLo = { (byte) 0x00, (byte) 0xC0, (byte) 0xC1, (byte) 0x01, (byte) 0xC3, (byte) 0x03,
            (byte) 0x02, (byte) 0xC2, (byte) 0xC6, (byte) 0x06, (byte) 0x07, (byte) 0xC7, (byte) 0x05, (byte) 0xC5,
            (byte) 0xC4, (byte) 0x04, (byte) 0xCC, (byte) 0x0C, (byte) 0x0D, (byte) 0xCD, (byte) 0x0F, (byte) 0xCF,
            (byte) 0xCE, (byte) 0x0E, (byte) 0x0A, (byte) 0xCA, (byte) 0xCB, (byte) 0x0B, (byte) 0xC9, (byte) 0x09,
            (byte) 0x08, (byte) 0xC8, (byte) 0xD8, (byte) 0x18, (byte) 0x19, (byte) 0xD9, (byte) 0x1B, (byte) 0xDB,
            (byte) 0xDA, (byte) 0x1A, (byte) 0x1E, (byte) 0xDE, (byte) 0xDF, (byte) 0x1F, (byte) 0xDD, (byte) 0x1D,
            (byte) 0x1C, (byte) 0xDC, (byte) 0x14, (byte) 0xD4, (byte) 0xD5, (byte) 0x15, (byte) 0xD7, (byte) 0x17,
            (byte) 0x16, (byte) 0xD6, (byte) 0xD2, (byte) 0x12, (byte) 0x13, (byte) 0xD3, (byte) 0x11, (byte) 0xD1,
            (byte) 0xD0, (byte) 0x10, (byte) 0xF0, (byte) 0x30, (byte) 0x31, (byte) 0xF1, (byte) 0x33, (byte) 0xF3,
            (byte) 0xF2, (byte) 0x32, (byte) 0x36, (byte) 0xF6, (byte) 0xF7, (byte) 0x37, (byte) 0xF5, (byte) 0x35,
            (byte) 0x34, (byte) 0xF4, (byte) 0x3C, (byte) 0xFC, (byte) 0xFD, (byte) 0x3D, (byte) 0xFF, (byte) 0x3F,
            (byte) 0x3E, (byte) 0xFE, (byte) 0xFA, (byte) 0x3A, (byte) 0x3B, (byte) 0xFB, (byte) 0x39, (byte) 0xF9,
            (byte) 0xF8, (byte) 0x38, (byte) 0x28, (byte) 0xE8, (byte) 0xE9, (byte) 0x29, (byte) 0xEB, (byte) 0x2B,
            (byte) 0x2A, (byte) 0xEA, (byte) 0xEE, (byte) 0x2E, (byte) 0x2F, (byte) 0xEF, (byte) 0x2D, (byte) 0xED,
            (byte) 0xEC, (byte) 0x2C, (byte) 0xE4, (byte) 0x24, (byte) 0x25, (byte) 0xE5, (byte) 0x27, (byte) 0xE7,
            (byte) 0xE6, (byte) 0x26, (byte) 0x22, (byte) 0xE2, (byte) 0xE3, (byte) 0x23, (byte) 0xE1, (byte) 0x21,
            (byte) 0x20, (byte) 0xE0, (byte) 0xA0, (byte) 0x60, (byte) 0x61, (byte) 0xA1, (byte) 0x63, (byte) 0xA3,
            (byte) 0xA2, (byte) 0x62, (byte) 0x66, (byte) 0xA6, (byte) 0xA7, (byte) 0x67, (byte) 0xA5, (byte) 0x65,
            (byte) 0x64, (byte) 0xA4, (byte) 0x6C, (byte) 0xAC, (byte) 0xAD, (byte) 0x6D, (byte) 0xAF, (byte) 0x6F,
            (byte) 0x6E, (byte) 0xAE, (byte) 0xAA, (byte) 0x6A, (byte) 0x6B, (byte) 0xAB, (byte) 0x69, (byte) 0xA9,
            (byte) 0xA8, (byte) 0x68, (byte) 0x78, (byte) 0xB8, (byte) 0xB9, (byte) 0x79, (byte) 0xBB, (byte) 0x7B,
            (byte) 0x7A, (byte) 0xBA, (byte) 0xBE, (byte) 0x7E, (byte) 0x7F, (byte) 0xBF, (byte) 0x7D, (byte) 0xBD,
            (byte) 0xBC, (byte) 0x7C, (byte) 0xB4, (byte) 0x74, (byte) 0x75, (byte) 0xB5, (byte) 0x77, (byte) 0xB7,
            (byte) 0xB6, (byte) 0x76, (byte) 0x72, (byte) 0xB2, (byte) 0xB3, (byte) 0x73, (byte) 0xB1, (byte) 0x71,
            (byte) 0x70, (byte) 0xB0, (byte) 0x50, (byte) 0x90, (byte) 0x91, (byte) 0x51, (byte) 0x93, (byte) 0x53,
            (byte) 0x52, (byte) 0x92, (byte) 0x96, (byte) 0x56, (byte) 0x57, (byte) 0x97, (byte) 0x55, (byte) 0x95,
            (byte) 0x94, (byte) 0x54, (byte) 0x9C, (byte) 0x5C, (byte) 0x5D, (byte) 0x9D, (byte) 0x5F, (byte) 0x9F,
            (byte) 0x9E, (byte) 0x5E, (byte) 0x5A, (byte) 0x9A, (byte) 0x9B, (byte) 0x5B, (byte) 0x99, (byte) 0x59,
            (byte) 0x58, (byte) 0x98, (byte) 0x88, (byte) 0x48, (byte) 0x49, (byte) 0x89, (byte) 0x4B, (byte) 0x8B,
            (byte) 0x8A, (byte) 0x4A, (byte) 0x4E, (byte) 0x8E, (byte) 0x8F, (byte) 0x4F, (byte) 0x8D, (byte) 0x4D,
            (byte) 0x4C, (byte) 0x8C, (byte) 0x44, (byte) 0x84, (byte) 0x85, (byte) 0x45, (byte) 0x87, (byte) 0x47,
            (byte) 0x46, (byte) 0x86, (byte) 0x82, (byte) 0x42, (byte) 0x43, (byte) 0x83, (byte) 0x41, (byte) 0x81,
            (byte) 0x80, (byte) 0x40 };

    public int value;

    public CRC16M() {
        value = 0;
    }

    public void update(byte[] puchMsg, int usDataLen) {
        int uIndex; // int i = 0; 
        for (int i = 0; i < usDataLen; i++) {
            uIndex = (uchCRCHi ^ puchMsg[i]) & 0xff;
            uchCRCHi = (byte) (uchCRCLo ^ auchCRCHi[uIndex]);
            uchCRCLo = auchCRCLo[uIndex];
        }

        value = ((((int) uchCRCHi) << 8 | (((int) uchCRCLo) & 0xff))) & 0xffff;
        return;
    }

    public void reset() {
        value = 0;
        uchCRCHi = (byte) 0xff;
        uchCRCLo = (byte) 0xff;
    }

    public int getValue() {
        return value;
    }

    private static byte uniteBytes(byte src0, byte src1) {
        byte _b0 = Byte.decode("0x" + new String(new byte[] { src0 })).byteValue();
        _b0 = (byte) (_b0 << 4);
        byte _b1 = Byte.decode("0x" + new String(new byte[] { src1 })).byteValue();
        byte ret = (byte) (_b0 ^ _b1);
        return ret;
    }

    private static byte[] HexString2Buf(String src) {
        int len = src.length();
        byte[] ret = new byte[len / 2 + 2];
        byte[] tmp = src.getBytes();
        for (int i = 0; i < len; i += 2) {
            ret[i / 2] = uniteBytes(tmp[i], tmp[i + 1]);
        }
        return ret;
    }

    public static byte[] getSendBuf(String toSend) {
        byte[] bb = HexString2Buf(toSend);
        CRC16M crc16 = new CRC16M();
        crc16.update(bb, bb.length - 2);
        int ri = crc16.getValue();
        bb[bb.length - 1] = (byte) (0xff & ri);

        bb[bb.length - 2] = (byte) ((0xff00 & ri) >> 8);
        return bb;
    }

    public static boolean checkBuf(byte[] bb) {
        CRC16M crc16 = new CRC16M();
        crc16.update(bb, bb.length - 2);
        int ri = crc16.getValue();
        if (bb[bb.length - 1] == (byte) (ri & 0xff) && bb[bb.length - 2] == (byte) ((0xff00 & ri) >> 8))
            return true;
        return false;
    }

    public static String getBufHexStr(byte[] raw) {
        if (raw == null) {
            return null;
        }
        final StringBuilder hex = new StringBuilder(2 * raw.length);
        for (final byte b : raw) {
            hex.append(HEXES.charAt((b & 0xF0) >> 4)).append(HEXES.charAt((b & 0x0F)));
        }
        return hex.toString();
    }

    /** 
    * @param args   */
    public static void main(String[] args) {
        byte[] sbuf = CRC16M.getSendBuf("0c00373f0126038044332211");
        //byte[] sbuf = { (byte) 0xaa, 0x55, 0x0c, 0x00, 0x37, 0x3f, 0x01, 0x26, 0x03, (byte) 0x80, 0x44, 0x33, 0x22, 0x11 };
        System.out.println(CRC16M.getBufHexStr(sbuf));
    }
}

 

分享到:
评论

相关推荐

    java实现 crc16校验工具和代码

    在Java中实现CRC16校验工具,可以帮助开发者验证数据的完整性和准确性,尤其在通信协议、文件存储等领域。下面将详细解释CRC16的基本原理以及如何在Java中编写相关代码。 **CRC16基本原理** CRC16是一种基于多项式...

    java实现CRC16校验功能

    CRC16(Cyclic Redundancy...在Java中实现CRC16,可以利用位操作或者现成的工具类,结合提供的`CRC16Util.java`和`CharterConverter.java`,完成数据的校验和验证。这对于保证数据传输的准确性和系统的稳定性至关重要。

    Java版CRC16校验算法

    CRC16校验算法及十六进制和十六进制字符串转换

    Java编写的CRC校验

    在Java中实现CRC校验,首先需要了解CRC的多项式表示,通常以16进制形式给出。例如,常见的CRC-16和CRC-32分别对应于0x8005和0x04C11DB7的多项式。然后,我们需要对数据进行位移和异或操作,这些操作可以使用Java的位...

    JavaCRC16校验代码

    Java写的CRC16校验代码,经过验证正确无误。不是网上面糊乱写的错东西。Jar包包括源代码,也可直接引用。

    CRC16循环冗余算法

    CRC16循环冗余算法,高位在前和低位在后都有; 对特定字符串进行转换成16进制字符串,然后将字符串进行CRC16校验,得到校验码. 次工具类已经经过本人亲自验证,完全符合标准,目前项目中用到的就是这个工具类.

    crc-16-java.zip_CRC-16_crc16 java_desfire_desfire ev1_java crc

    描述中提到的"Program to calculate cyclic redundancy check crc16 written in Java",指的是一个用Java编写的程序,该程序的功能是计算CRC-16校验值。CRC-16算法通常包括两个主要步骤:生成多项式选择和数据异或...

    JAVA下两种方法实现CRC算法

    JAVA下使用两种方法(计算法、查表法)实现CRC(XMODEM)算法,以及验证代码

    java编写的两个modbus CRC16实现

    - 这些CRC16的Java实现可以用于验证Modbus通信中的数据完整性,防止因为传输错误导致的控制设备误动作。 - 在进行数据包的发送和接收时,可以利用这些类来计算和验证CRC,确保数据的正确性。 总之,`CRC16M.java`...

    CRC16校验码计算工具及源代码

    CRC16(Cyclic Redundancy Check,循环冗余校验)是一种广泛应用于数据通信和存储领域的错误检测机制。它通过附加一个固定长度的校验码来验证数据的完整性,通常用于确保数据在传输或存储过程中没有发生错误。在本...

    java开发ModBus工业控制通信协议CRC16验证通过测试.doc

    这个文档“java开发ModBus工业控制通信协议CRC16验证通过测试”显然是关于如何在Java环境中实现ModBus协议中的CRC16校验部分,并通过了相关的测试。 CRC(Cyclic Redundancy Check)循环冗余校验是一种广泛用于数据...

    各种CRC生成工具,包括CRC8,CRC16,CRC-CCITT,CRC32

    标题提及了四种CRC类型:CRC8、CRC16、CRC-CCITT和CRC32,它们分别代表了不同宽度的CRC校验码: 1. **CRC8**:这是一种8位的CRC校验,适用于校验较短的数据块。它使用一个8位的生成多项式,计算过程相对简单,常...

    java-crc.rar_crc java_crc-ccitt_java crc

    CRC(Cyclic Redundancy Check,循环冗余校验)是一种广泛用于数据传输错误检测的校验码技术,尤其在存储和通信领域中...在处理数据传输、文件验证等场景时,CRC 算法能够帮助我们及时发现潜在的错误,提高系统稳定性。

    javacrc校验

    ### Java CRC校验算法详解 CRC(Cyclic Redundancy Check)循环冗余校验是一种用于检测数据传输错误的方法,在通信、存储系统等场景中广泛应用。本文将详细解析一个简单的Java实现CRC校验的示例代码,并深入探讨其...

    CRC16校验程序(Java)

    Java写的CRC16校验代码,经过验证正确无误。不是网上面糊乱写的错东西。Jar包包括源代码,也可直接引用。

    CRC16各种模式校验

    这些代码通常由编程语言编写,如C、C++、Python或Java,它们实现了计算和验证CRC16校验码的功能。通过对这些代码的分析和学习,我们可以更好地理解CRC16的工作机制,并将其应用于实际项目中,确保数据传输的可靠性。...

    CRC.rar_CRC-8 java_CRC编码_crc_crc java_java crc

    另一方面,`www.pudn.com.txt`可能是一个包含示例数据或测试用例的文本文件,用于验证CRC函数的正确性。 在Java中实现CRC时,可以使用位操作类如`java.util.BitSet`或者直接使用位运算符(如`^`、`、`&gt;&gt;&gt;`等)。...

    JAVA写的CRC校验

    5. 结果验证:除了计算CRC外,类还可能包含一个方法来验证给定的CRC值是否与计算结果匹配,如`public static boolean verifyCRC(byte[] data, int calculatedCRC)`。 在安卓开发中,CRC校验可以应用于以下几个场景...

    CRC16检验码生成+二维码生成

    CRC16检验码生成与二维码技术是信息技术领域中两种重要的数据验证和编码方式。CRC,全称为Cyclic Redundancy Check(循环冗余校验),是一种广泛用于检测数字传输或存储过程中数据错误的校验方法。二维码则是一种二...

    crc.rar_crc java_java crc_java循环冗余

    `crc.java`文件则可能是实现CRC校验码验证功能的代码。在接收到数据后,该程序会读取附加的CRC校验码,根据预定义的CRC多项式对整个接收数据(包括原始数据和CRC校验码)进行除法运算。如果计算得到的余数为零,表明...

Global site tag (gtag.js) - Google Analytics