CRC Контрольная сумма итерации Java - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь вычислить контрольную сумму 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 Что является первым xor двух строк.Но цикл не продолжит повторять эту строку с шаблоном снова.Что я могу сделать, чтобы исправить эту проблему цикла?Или я об этом неправильно говорю?

1 Ответ

0 голосов
/ 17 октября 2018

Как уже упоминалось, это может помочь не реализовать алгоритм CRC, но решить ваш конкретный запрос о помощи, чтобы вы знали, как это сделать в будущем. Я включу ответ.

Простойway

Один простой, но несколько неэффективный способ повторять pAr снова и снова по мере необходимости - это цикл до конца mAr вместо pAr и использование % в индексе для его уменьшенияк чему-то в pAr:

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;
    }
}
...