【发布时间】: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:我刚刚根据您的要求更新了帖子。