Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';我的CRC算法有什么问题?(爪哇)_Java_Algorithm_Crc - Fatal编程技术网

Java 什么';我的CRC算法有什么问题?(爪哇)

Java 什么';我的CRC算法有什么问题?(爪哇),java,algorithm,crc,Java,Algorithm,Crc,昨天我问了一个范围更广的问题,但我认为删除它并将我的问题缩小一点可能是明智的。同样,为了诚实起见,是的,这是家庭作业。我正试图用以下多项式开发一个CRC算法: x15+x13+x6+x4+x1+1 我应该传递两个字节(8位),将它们组合成一个16位的结果(因此我将第一个字节左移8,然后将两个字节相加),然后使用上面的多项式找到CRC。我一直在检查我的输出应该使用什么,但我似乎没有得到正确的答案 我所拥有的: (相关全局变量) (实际算法) 公共静态无效crc(字节第一,字节第二){ long t

昨天我问了一个范围更广的问题,但我认为删除它并将我的问题缩小一点可能是明智的。同样,为了诚实起见,是的,这是家庭作业。我正试图用以下多项式开发一个CRC算法:

x15+x13+x6+x4+x1+1

我应该传递两个字节(8位),将它们组合成一个16位的结果(因此我将第一个字节左移8,然后将两个字节相加),然后使用上面的多项式找到CRC。我一直在检查我的输出应该使用什么,但我似乎没有得到正确的答案

我所拥有的:

(相关全局变量)

(实际算法)

公共静态无效crc(字节第一,字节第二){

long total=((首先好,这更接近。您需要检查高位,然后移位,如果高位为1,则检查独占或多项式。之后进行移位,这显然是错误的,因为它保证了答案始终具有低位零

已编辑答案的更新:

代码现在是正确的。但是,您在链接的网站上输入的多项式不正确。实际的多项式也有一个x16项。请输入前导项

更新以进行其他编辑:


您不会分别为每对字节计算CRC。相反,您会继续使用更多字节处理CRC。在第一步之前,您将初始CRC 0与两个字节进行异或运算(尽管您可能没有意识到您这样做了)。只需继续使用中级CRC就可以了。

你比我差了一点……这就是我得到的结果,提问者的程序生成的答案与计算器相同,但左移了1位。编辑OP以包含我的更改,但不起作用。我是否仍然做得不正确?如果我的代码正确,那么我的总体问题一定是ac累积CRC。我得到一个字符串,必须找到它们之间的累积CRC。“…显示CRC计算或验证中涉及的每64个字符行的累积XOR操作的结果。”这基本上意味着该算法32个实例的累积CRC(每次调用函数时64个字符/2个字符)。我该怎么做?在OP中添加了更多信息,因为我现在意识到我还需要一件事的帮助。对不起,您是否愿意更详细/更具体地介绍一下?我正试图弄清楚如何做您所说的,但我遇到了困难。
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 (int i = 0; i < binaryCRC.length(); i++) {
        if ((total & mask) == mask) {
            total = (total << 1) ^ divisor;
        } else {
            total <<= 1;
        }
    }
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++;
}
}