crc16 implementation java

后端 未结 4 1545
陌清茗
陌清茗 2020-12-10 18:41

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 th

4条回答
  •  臣服心动
    2020-12-10 19:08

    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;
    }
    
    }
    

提交回复
热议问题