【发布时间】:2019-06-18 17:12:09
【问题描述】:
这个算法中这个名为 Offset 的变量是什么意思? 它在第二个 calcCrc16 参数中声明。 对我来说,它是无用的,因为它是零并且它被用于总和。
此算法生成一个 crc-16。我试图理解这个算法,因为必须创建一个验证 crc-16 的算法,并且我想使用这个代码作为基础。
public sealed class CRC
{
private readonly int _polynom;
public static readonly CRC Default = new CRC(0xA001);
public CRC(int polynom)
{
_polynom = polynom;
}
public int CalcCrc16(byte[] buffer)
{
return CalcCrc16(buffer, 0, buffer.Length, _polynom, 0);
}
public static int CalcCrc16(byte[] buffer, int offset, int bufLen, int polynom, int preset)
{
preset &= 0xFFFF;
polynom &= 0xFFFF;
var crc = preset;
for (var i = 0; i < (bufLen + 2); i++)
{
var data = buffer[(i + offset) % buffer.Length] & 0xFF;
crc ^= data;
for (var j = 0; j < 8; j++)
{
if ((crc & 0x0001) != 0)
{
crc = (crc >> 1) ^ polynom;
}
else
{
crc = crc >> 1;
}
}
}
return crc & 0xFFFF;
}
}
【问题讨论】:
-
原始数据数组中的起始位置。如果您不希望标头参与 CRC 计算,则可以将其设置为非零值。