【问题标题】:Programming the CRC algorithm manipulating Strings in Java用 Java 编写 CRC 算法操作字符串
【发布时间】:2025-12-09 13:00:01
【问题描述】:

我是一名大学生,目前正在编写作业。我需要编写各种发送和接收消息的方法,例如汉明算法和循环冗余校验。

我正在尝试在发送端对 CRC 方法进行编程,但我无法成功编程所需的多项式除法。我尝试了这里发布的几种解决方案,例如使用 BitSet 进行除法,但均无济于事。

由于我使用的是在 NetBeans 8.0.1 中设计的图形界面,所以我的问题是:如何操作来自多个 jTextField 的字符串以使用 CRC 算法生成二进制消息?

注意:这是我第一次使用 Stack Overflow,所以如果我遗漏了什么,请为我指出。提前致谢。

编辑:根据要求,这是我使用 BitSet 的示例代码:(注意:一些变量名称是西班牙语,因为我是母语为西班牙语的人)

public static String CRC(String m, String G){
    BitSet dividendo, divisor, divid1, divid2, resto, blanco;

    dividendo = new BitSet(m.length());
    divisor = new BitSet(G.length());
    blanco = new BitSet(G.length());
    blanco.clear();


    for (int i = 0; i < m.length(); i++){
        if(Integer.parseInt(m.substring(i, i+1)) == 1) {
            dividendo.set(i);
        } else {
            dividendo.clear(i);
        }
    }

    for (int i = 0; i < G.length(); i++){
        if(Integer.parseInt(G.substring(i, i+1)) == 1) {
            divisor.set(i);
        } else {
            divisor.clear(i);
        }
    }

    divid1 = dividendo.get(0, divisor.length());

    int largo1, largo2, largo3, largo4;
    largo1 = dividendo.length();
    largo2 = divisor.length();
    largo3 = blanco.length();
    largo4 = divid1.length();

    for (int i = divisor.length(); i < dividendo.length(); i++) {
        if (divid1.get(0) == divisor.get(0)){
            divid1.xor(divisor);

            divid2 = new BitSet(divid1.length());
            for (int j = 1; j<divid1.length(); j++){
                if(divid1.get(j))
                    divid2.set(j-1);
                else
                    divid2.clear(j-1);
            }

            boolean valor = dividendo.get(i);
            int largo5 = divid2.length();
            divid2.set(divid2.length(), valor);

            divid1 = divid2;   
        } else {
            divid1.xor(blanco);

            divid2 = new BitSet(divid1.length());
            for (int j = 1; j<divid1.length(); j++){
                if(divid1.get(j))
                    divid2.set(j);
                else
                    divid2.clear(j);
            }
            boolean valor = dividendo.get(i);

            divid2.set(divid2.length(), valor);

            divid1 = divid2;
        }
    }

    resto = new BitSet(divid1.length());
        for (int j = 1; j<divid1.length(); j++){
            if(divid1.get(j))
                resto.set(j);
            else
                resto.clear(j);
        }

    String mFinal = dividendo.toString() + resto.toString();

    return mFinal;
}

有输入

String m = "10010101"
String G = "1011"

我的预期输出与实际输出是

expected = 10010101010
actual = {0, 3, 5, 7}{1, 2, 3} (first array is the original message, second is the appended remainder)

使用上面提到的代码。

我不知道自己做错了什么,因此我们将不胜感激。

【问题讨论】:

  • 你的问题不够精确,你有没有实际输出和预期输出的代码?
  • 如果您可以向我们展示一些(但不要太多)代码并解释它应该做什么以及它做了什么,您会得到更好的答案。就目前而言,您的问题可能会结束。
  • @Florent:我刚刚根据您的要求更新了帖子。

标签: java string algorithm crc


【解决方案1】:

CRC 不是通过逐项进行多项式除法来计算的。 GF(2) 上的多项式及其除法是 CRC 的定义和数学分析方式。实际计算是使用存储在机器整数中的多项式和状态的二进制表示完成的,使用旋转和异或对多项式的所有项进行并行运算。

我推荐 Ross Williams' tutorial on CRCs 来描述如何从 GF(2) 上的多项式到二进制字符串的异或和旋转。

【讨论】: