package com.ruoyi.sim.util;

public class CRC16Modbus {

    private static final int POLYNOMIAL = 0xA001; // CRC-16/MODBUS 多项式
    private static final int INITIAL_VALUE = 0xFFFF; // 初始值

    public static byte[] calculateCRC(byte[] data) {
        int crc = INITIAL_VALUE;
        for (byte b : data) {
            crc ^= (b & 0xFF); // 将数据字节与寄存器低 8 位异或
            for (int i = 0; i < 8; i++) {
                if ((crc & 0x0001) != 0) { // 检查最低位
                    crc >>= 1;
                    crc ^= POLYNOMIAL;
                } else {
                    crc >>= 1;
                }
            }
        }
        // 返回 CRC 值，低位在前，高位在后
        return new byte[]{(byte) (crc & 0xFF), (byte) (crc >> 8)};
    }

    /**
     * main test.
     * @param args
     */
    public static void main(String[] args) {
        byte[] data = {0x01, 0x03, 0x00, 0x20, 0x00, 0x01}; // 示例数据
        byte[] crc = calculateCRC(data);
        System.out.println("CRC-16/MODBUS: " + String.format("%02X %02X", crc[0], crc[1]));
    }
}
