[英]Explain this CRC16 checksum function
我对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
};
假设a
与responseFromDevice
相同,它将为消息计算某种哈希函数(减去第一个字节和最后三个字节),然后将其打印出来,并在消息末尾加上一个数字(校验和) 。 它跳过的字节是设备的校验和,大概是一些成帧字节。 实际的实现方式大概会将计算出的哈希值与消息中找到的哈希值进行比较,以验证其是否完整。
如果您真的想知道哈希函数是如何工作的,则必须深入阅读该主题,但是如果您想对它们的作用以及它们的优点进行外围描述,请阅读Wikipedia文章 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.