1

我有一个用于 255 字节数据的 CRC16 校验和的功能。

校验和从第一个字节到倒数第三个字节计算。您能说出这些代码中发生了什么,特别是“ekmCheckCrc”函数吗?下面是我得到的功能。

public void tryMe(byte[] responseFromDevice)
{
            byte[] c = new byte[2];
            c[0] = a[253];
            c[1] = a[254];

            log("EKM CRC : " + Integer.toHexString(ekmCheckCrc(responseFromDevice)) +
            " Device CRC : " + Integer.toHexString((int) (c[0])) + Integer.toHexString((int) (c[1])) );
}

    public int ekmCheckCrc(byte[] dat) {
        int crc = 0xffff;

        for (int i = 1; i < dat.length-3; i++) {
            crc = (crc >>> 8) ^ ekmCrcLut[(crc ^  dat[i]) & 0xff];
        }

       crc = (crc >>> 8) | (crc << 8);
       crc = crc & 0x7f7f;

        return crc;
    }

    static int[] ekmCrcLut = new int[]{
        0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241,
                       (EKM's LUT sits here, no point including the rest of it)
        0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040
    };
4

1 回答 1

0

假设它a与 相同responseFromDevice,它正在为消息计算某种哈希函数(减去第一个字节和最后三个字节),然后将其打印出来,加上在消息末尾找到的一个数字(校验和)。它跳过的字节是设备的校验和,大概是一些帧字节。一个真正的实现可能会将计算的哈希值与消息中找到的哈希值进行比较,以验证它是否完好无损。

如果您真的想知道散列函数是如何工作的,则必须深入研究该主题,但如果您想了解它们的作用和用途,请阅读Wikipedia 文章

于 2012-12-30T17:48:17.377 回答