【发布时间】:2021-03-02 23:30:47
【问题描述】:
我有两个 CrC 需要解决。 多项式长度:8 位,隐含第 9 位 1 位 多项式值:0x85 初始值:0x00
和
多项式长度:5 位,隐含第 6 个 1 位 多项式值:0x15 初始值:0x00
My first was very easy, with the following code.
byte generator = 0x85;
byte crc = 0; /* start with 0 so first byte can be 'xored' in */
foreach (byte currByte in bytes)
{
crc ^= currByte; /* XOR-in the next input byte */
for (int i = 0; i < 8; i++)
{
if ((crc & 0x80) != 0)
{
crc = (byte)((crc << 1) ^ generator);
}
else
{
crc <<= 1;
}
}
}
return crc;
但是对于我的生活,我不明白 5 位是如何工作的。当然生成器是 0x15 但在上面不起作用。我想也许我运行循环 5 次而不是 8 次,但也没有得到它。
多项式 0x15 的示例 CRC。 0x80, 0x00 应该得到 0x01 的 5bit crc
0x00, 0x20 应该得到 0x15 的 5bit crc
0x01,0x00 应该得到 0x16 的 5bit crc
0x01,0x20 应该得到 0x03 的 5bit crc
0x01,0x40 应该得到 0x09 的 5bit crc
0x01,0x60 应该得到 0x1c 的 5bit crc
为了更好地理解这是如何工作的。有一个 2 字节的内存地址,每 32 个字节步进。由于 5 个额外的位从未使用过,因此 crc 进入其中。
内存地址0x0020示例
0000000000100000 (0x20)
or'd crc 结果为 0x15
0000000000010101 (0x15)
=
0000000000110101 (0x35)
所以我需要获取我的地址 0x0020 并返回一个 crc 0x15。上面提到了 Crc 的详细信息。它是经过验证的 Crc,可用于给定的应用程序。
根据下面的建议,但没有得到我应该得到的结果。
byte generator = 0x15;
byte crc = 0; /* start with 0 so first byte can be 'xored' in */
foreach (byte currByte in bytes)
{
crc ^= currByte; /* XOR-in the next input byte */
for (int i = 0; i < 8; i++)
{
if ((crc & 0x80) != 0)
{
crc = (byte)((crc << 1) ^ (generator << 3));
}
else
{
crc <<= 1;
}
}
}
return (byte)(crc >>= 3);
【问题讨论】:
-
您的第二个代码示例不完整。
generator设置为什么? -
你需要添加一个你正在使用的语言的标签。
-
是说在 OP -“当然生成器是 0x15”
-
为了查找错误,任何来源都需要完整,而不是从文本中推断出来。还是没有。
-
您需要提供更多示例消息和相关的 CRC。您的 CRC 描述与您的示例不匹配。