crc16 implementation java

2019-01-19 05:19发布

I am having problems with calculating CRC-16 implementation of a byte array in java. Basically I am trying to send bytes to a RFID that starts writing to a tag. I can see the checksum value of array by looking tcpdump command on mac. But my goal is to generate it by myself. Here is my byte array which should generate 0xbe,0xd9:

byte[] bytes = new byte[]{(byte) 0x55,(byte) 0x08,(byte) 0x68, (byte) 0x14, 
                          (byte) 0x93, (byte) 0x01, (byte) 0x00, (byte) 0x00, 
                          (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x06, 
                          (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x00, 
                          (byte) 0x13, (byte) 0x50, (byte) 0x00, (byte) 0x00, 
                          (byte) 0x00, (byte) 0x22, (byte) 0x09, (byte) 0x11};

0x55 is the header. As the documentation says it will be excluded.

Whenever I try this array on java (with 0xbe,0xd9), RFID works. My problem is the generating of those checksum values. I searched almost entire web but no chance. I couldn't find any algorithm that produces 0xbe,0xd9.

Any idea is most welcome for me. Thanks in advance.

edit: here is the protocol that provided with rfid

3条回答
We Are One
2楼-- · 2019-01-19 05:38

Maybe are you looking for this?

Crc16 in java

I use the same array (variable "table") in this method:

 public Integer computeCrc16(byte[] data) {
    int crc = 0x0000;
    for (byte b : data) {
        crc = (crc >>> 8) ^ table[((crc ^ b) & 0xff)];

    }

    return (int) crc;
}
查看更多
虎瘦雄心在
3楼-- · 2019-01-19 05:49

There is a CRC16 implementation in the Java runtime (rt.jar) already.

Please see grepcode for the source.

You will probably be able to see it in your IDE if you search for CRC16:

picture of class search for CRC16

查看更多
Summer. ? 凉城
4楼-- · 2019-01-19 05:55

I'm not really sure if this is the correct translation in Java of the C crc16 algorithm.... but it shows the correct result for your example!

Please compare other results with Mac's CRC16 and stress-test it before using it.

public class Crc16 {
public static void main(String... a) {
    byte[] bytes = new byte[] { (byte) 0x08, (byte) 0x68, (byte) 0x14, (byte) 0x93, (byte) 0x01, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x06, (byte) 0x00, (byte) 0x00, (byte) 0x01,
            (byte) 0x00, (byte) 0x13, (byte) 0x50, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x22, (byte) 0x09,
            (byte) 0x11 };
    byte[] byteStr = new byte[4];
    Integer crcRes = new Crc16().calculate_crc(bytes);
    System.out.println(Integer.toHexString(crcRes));

    byteStr[0] = (byte) ((crcRes & 0x000000ff));
    byteStr[1] = (byte) ((crcRes & 0x0000ff00) >>> 8);

    System.out.printf("%02X\n%02X", byteStr[0],byteStr[1]);
} 

int calculate_crc(byte[] bytes) {
    int i;
    int crc_value = 0;
    for (int len = 0; len < bytes.length; len++) {
        for (i = 0x80; i != 0; i >>= 1) {
            if ((crc_value & 0x8000) != 0) {
                crc_value = (crc_value << 1) ^ 0x8005;
            } else {
                crc_value = crc_value << 1;
            }
            if ((bytes[len] & i) != 0) {
                crc_value ^= 0x8005;
            }
        }
    }
    return crc_value;
}

}
查看更多
登录 后发表回答