昨天问了一个更广泛的问题,但我认为删除它并缩小我的问题范围可能是明智的。再次,为了诚实起见,是的,这是作业。我正在尝试使用以下多项式开发 CRC 算法:
x15+x13+x6+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;
}
}
也许我做错了,但当我这样做时,我的输出变得非常遥远。将我的两个字节的值设置为字符“a”和“b”的 ASCII 值(总计 = 6162)时,我得到 6162 -> 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++;
}
}
最佳答案
好的,这更近了。您需要检查高位,然后是移位,然后是异或多项式,如果高位是是一个。您在之后进行移位,这显然是错误的,因为它保证答案始终具有低位零。
已编辑答案的更新:
代码现在是正确的。但是,您在链接的网站上输入的多项式不正确。实际多项式也有 x16 项。放入那个领先的。
另一个编辑的更新:
您不需要为每对字节分别计算 CRC。相反,您继续使用更多字节处理 CRC。在第一步之前,您将初始 CRC 零与两个字节进行了异或运算(尽管您可能没有意识到您这样做了)。只需对中间 CRC 继续这样做。
关于java - 我的 CRC 算法有什么问题? ( java ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27138839/