【问题标题】:CRC Checksum iteration JavaCRC校验和迭代Java
【发布时间】:2018-10-17 14:21:39
【问题描述】:

我正在尝试计算两个二进制字符串的 crc 校验和,但我只能获得循环的第一次迭代。将字符串转换为字符串数组,最后转换为 int 数组。错误检查在别处进行。

public String checksum(String a, String b) {
    // These arrays will convert the input strings to an array
    String[] mArray = a.split("");
    String[] pArray = b.split("");

    // Creates arrays from the above corresponding arrays
    int[] mAr = new int[mArray.length];
    int[] pAr = new int[pArray.length];

    // populates message array
    for (int i = 0; i < a.length(); i++) {
        mAr[i] = Integer.parseInt(mArray[i]);

    }
    // populates pattern array
    for (int i = 0; i < b.length(); i++) {
        pAr[i] = Integer.parseInt(pArray[i]);
    }

    //int frame = mAr.length - pAr.length + 1;
    int pLength = pAr.length;
    int mLength = mAr.length;
//  int[] checksum = new int[frame];

    System.out.println(pLength);

 //CHECKSUM ITERATION
    for (int i = 0; i < pAr.length; i++) {
        mAr[i] = mAr[i] ^ pAr[i];
        if (i ==pLength) {
    //      mAr[i] = mAr[i] >> 1;
            i = 0;

        }
    }
    for (int i = 0; i < mAr.length; i++) {
        System.out.print(mAr[i]);
    }

我的测试是 留言:11001010 图案:10011 预期产量:0100 但相反,我得到:01010010 这是两个字符串的第一个异或。但是循环不会继续用模式再次对那个字符串进行异或。我能做些什么来纠正这个循环问题?还是我做错了?

【问题讨论】:

  • if (i ==pLength) { - 这个分支永远不会被击中。
  • 这只是一个 XOR,而不是 CRC 算法,继续对消息中的模式进行 XOR 不会使其成为 CRC 算法,它是一种根本不同的算法(XOR 是 part是的)
  • 如果你想要一个字符数组,使用string.toCharArray()会便宜很多。您可以使用ch - '0' 解析每个整数中的整数,但错误检查较少。
  • @meowgoesthedog 是的,我刚刚把它修好了,然后打到了分支
  • @harold 我理解那部分,但我无法获得最终的异或,因此无法继续编辑:除非这是错误的?

标签: java algorithm iteration checksum crc


【解决方案1】:

正如人们所提到的,这可能无助于实现 CRC 算法,但为了解决您的特定帮助请求,以便您知道将来如何解决,我将提供答案。

简单的方法

根据需要一遍又一遍地重复 pAr 的一种简单但效率较低的方法是循环直到 mAr 结束而不是 pAr 并在索引上使用 % 以将其减少到 @ 987654325@:

for (int i = 0; i < mAr.length; i++) {
    mAr[i] = mAr[i] ^ pAr[i % pAr.length];
}

更高效的方式

更复杂但可能更有效的事情是:

for (int i = 0, j = 0; i < mAr.length; i++) {
    mAr[i] = mAr[i] ^ pAr[j];

    j++;
    if (j == pAr.length) {
        j = 0;
    }
}

使用^= 使内容更具可读性

就像你可以使用+=一样,^=也可以使用,它不仅更短,而且可以帮助读者很快知道mAr[i]在等号的左右两边都有效无需花费额外的思考时间即可发现:

for (int i = 0; i < mAr.length; i++) {
    mAr[i] ^= pAr[i % pAr.length];
}
for (int i = 0, j = 0; i < mAr.length; i++) {
    mAr[i] ^= pAr[j];

    j++;
    if (j == pAr.length) {
        j = 0;
    }
}

【讨论】:

    猜你喜欢
    • 2014-05-11
    • 2015-06-29
    • 1970-01-01
    • 2016-11-13
    • 2013-12-21
    • 2021-05-11
    • 2013-01-10
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多