gpt4 book ai didi

java - 具有任意值和长度的 CRC 计算

转载 作者:行者123 更新时间:2023-12-02 06:00:08 26 4
gpt4 key购买 nike

我正在尝试修改that一段代码,使其可以处理任意值和长度。

到目前为止我的修改:

public static int ModRTU_CRC(final byte[] buf, int crc)
{
final int len = buf.length;

for (int pos = 0; pos < len; pos++)
{
crc ^= buf[pos]; // XOR byte into least sig. byte of crc

for (int i = 8; i != 0; i--)
{ // Loop over each bit
if ((crc & 0x0001) != 0)
{ // If the LSB is set
crc >>= 1; // Shift right and XOR 0xA001
crc ^= 0xA001;
}
else
{
// Else LSB is not set
crc >>= 1; // Just shift right
}
}
}
// Note, this number has low and high bytes swapped, so use it
// accordingly (or swap bytes)
return crc;
}

我正在通过以下方式测试我的代码:

final String a = "1101011011";
final String crc = "10011";
final int parsedA = Integer.parseInt(a, 2);
final ByteBuffer parsedBytes = ByteBuffer.allocate(4).putInt(parsedA);
final byte[] array = parsedBytes.array();
final int parsedCRC = Integer.parseInt(crc, 2);

System.out.println(Integer.toBinaryString(ModRTU_CRC(array, parsedCRC)));

我得到1000111101000101,但正确答案是11010110111110。即使我交换字节,我也无法达到目标。你能帮我找出我哪里出错了吗?

最佳答案

你真的很困惑。您尝试的示例直接来自 Ross William 的 CRC 教程。您需要再次完整地阅读该教程,并且要更慢,边读边解决所有问题。

CRC 和 CRC 多项式是两个不同的东西。您的 10011 是教程中的 CRC 多项式 x4+x+1。您的 1101011011 就是消息。从教程中可以看出,消息除以 0000 并附加 CRC 多项式后的余数为 1110就是 CRC。它是一个四位 CRC,因为它使用四次多项式。

那么你认为你应该得到的是附加了 CRC 的消息,即 11010110111110。那不是 CRC。这是附加了 CRC 的消息。该消息和附加的 CRC 具有以下属性:如果将其除以 CRC 多项式,则余数为零。这就是计算 CRC 后通常传输的内容。

出于某种原因,您尝试使用 CRC 例程执行此操作,该例程对 16 位 CRC 使用不同的多项式(0xA001 用于多项式 x 16+x15+x2+1,反转),将教程中示例中的 CRC 多项式输入到初始 CRC 应该的位置go 进入例程(回想一下,CRC 和 CRC 多项式是两个不同的东西),并将 10 位消息提供为 32 位。此外,您以大端顺序呈现消息(假设您没有更改该字节缓冲区的顺序),它首先提供一堆零,并且您正在使用一次处理八位的例程,该例程使得仅处理十位是不可能的。

您应该放弃 CRC 例程,并重新开始本教程。

关于java - 具有任意值和长度的 CRC 计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22742516/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com