我的CRC算法出了什么问题? (JAVA)

时间:2014-11-25 23:39:46

标签: java algorithm crc

昨天曾问过一个更广泛的问题,但认为删除它并缩小我的问题可能是谨慎的。同样,为了诚实,是的,这是家庭作业。我试图用以下多项式开发CRC算法:

X15 + X13 + 5233 + X4 + X1 + 1

我应该传递两个字节(8位),将它们组合成一个16位结果(所以我将第一个字节左移8,然后将两个加在一起),然后找到CRC使用上面的多项式。我一直在使用this tool查看输出内容,但我似乎无法得到正确答案。

我有什么:

(相关全局​​变量)

static String binaryCRC = "1010000001010011";
static long divisor = Long.parseLong(binaryCRC, 2);
static int mask = 0x8000;

(实际算法)

public static void crc(byte first, byte second) {

    long total = ((first << 8) + second);
    System.out.print(Long.toHexString(total));

    for (int i = 0; i < binaryCRC.length(); i++) {
        if ((total & mask) == mask) {
            total ^= divisor;
        }

        total <<= 1;
    }
    System.out.println(" -> " + Long.toHexString(total));
}

编辑:我尝试使用下面给出的建议修改我的for循环:

for (int i = 0; i < binaryCRC.length(); i++) {
        if ((total & mask) == mask) {
            total = (total << 1) ^ divisor;
        } else {
            total <<= 1;
        }
    }

也许我做错了,但是当我这样做时,我的输出变得非常遥远。将我的两个字节的值设置为chars&#39; a&#39;的ASCII值时和&#39; b&#39; (总数= 6162),我得到6162 - &gt; 4f1b065d,当我得到77eb时。

编辑2:我在下面简要概述了它,但为了清楚起见,我添加了我需要做的其余部分,因为我不知道如何在多个部分找到累积的CRC字符。

我需要找到下面字符串的累积CRC,并且每隔64个字符打印一次CRC。我的答案目前是前64位的bf58,当答案应该是1a6a时。

public class test2 {

static String binaryCRC = "1010000001010011";
static long divisor = Long.parseLong(binaryCRC, 2);
static long cumCRC = divisor;
static long mask = 0x8000;
static long[] crcTable = new long[256];
static int counter = 0;

static String text = "abcdefghijklmnopqrstuvwxyz12345-ABCDEFGHIJKLMNOPQRSTUVWX"
        + "YZ12345abcdefghijklmnopqrstuvwxyz12345-ABCDEFGHIJKLMNOPQ"
        + "RSTUVWXYZ12345abcdefghijklmnopqrstuvwxyz12345-ABCDEFGHIJ"
        + "KLMNOPQRSTUVWXYZ12345abcdefghijklmnopqrstuvwxyz12345-ABC"
        + "DEFGHIJKLMNOPQRSTUVWXYZ12345abcdefghijklmnopqrstuvwxyz12"
        + "345-ABCDEFGHIJKLMNOPQRSTUVWXYZ12345abcdefghijklmnopqrstu"
        + "vwxyz12345-ABCDEFGHIJKLMNOPQRSTUVWXYZ12345.............."
        + "........................................................"
        + "........................................................"
        + "000075dc";

static char[] chars = text.toCharArray();

public static void main(String[] args) {

    for (int i = 0; i < chars.length - 8; i += 2) {
        crc((byte)chars[i], (byte)chars[i + 1]);
        System.out.print(chars[i] + "" + chars[i+1]);

         //Probably wrong
         cumCRC = ((cumCRC >> 8) ^ crcTable[i / 2]) & 0xFFFF;

        if ((i + 2) % 64 == 0) {
            System.out.println(" - " + Long.toHexString(cumCRC));
        }
    }

}

public static void crc(byte first, byte second) {

    long total = ((first << 8) + second);
    //System.out.print(Long.toHexString(total));

    for (int i = 0; i < binaryCRC.length(); i++) {
        if ((total & mask) != 0) {
            total = (total << 1) ^ divisor;
        } else {
            total <<= 1;
        }

    }
    //System.out.println(" -> " + Long.toHexString(total));

    crcTable[counter] = total;
    counter++;
}
}

1 个答案:

答案 0 :(得分:2)

好的,这更接近了。如果高位 是1,则需要检查高位,然后移位,然后是异或 - 或多项式。你之后正在进行转换,这显然是错误的,因为它保证了答案始终具有零位的低位。

已修改答案的更新:

现在代码正确无误。但是,您在链接的网站上输入的多项式不正确。实际多项式也具有x 16 项。投入那个领先的。

另一个编辑的更新:

您不分别为每对字节计算CRC。相反,您继续使用更多字节处理CRC。在第一步之前,您使用两个字节对初始CRC(零)进行独占(尽管您可能没有意识到这样做了)。只需继续使用中间CRC。