Javascript 初学者对循环冗余码算法的理解

Javascript 初学者对循环冗余码算法的理解,javascript,png,crc,libpng,crc32,Javascript,Png,Crc,Libpng,Crc32,首先,它以称为“CRC”或“循环冗余码”的PNG文件格式讨论了这一概念。我以前从未听说过,所以我正在努力理解它 采用的CRC多项式是 x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2 +x+1 在PNG中,32位CRC被初始化为所有1,然后是数据 从最低有效位(1)到 最高有效位(128)。处理完所有数据字节后, CRC被反转(取其1的补码)。此值为 首先传输(存储在数据流中)MSB。为了 分为字节并进行排序,即 32位CRC定义为x31项的系数 所以

首先,它以称为“CRC”或“循环冗余码”的PNG文件格式讨论了这一概念。我以前从未听说过,所以我正在努力理解它

采用的CRC多项式是

x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2 +x+1

在PNG中,32位CRC被初始化为所有1,然后是数据 从最低有效位(1)到 最高有效位(128)。处理完所有数据字节后, CRC被反转(取其1的补码)。此值为 首先传输(存储在数据流中)MSB。为了 分为字节并进行排序,即 32位CRC定义为x31项的系数

所以让我告诉你我对这件事的理解和不理解

我听说过多项式,但在这方面,我有点困惑它们是如何在这里实现的

在这种情况下,“x”应该代表什么?32位循环中的当前位?这让我们进入下一部分:

所以它说要生成一个空的32位数字(或者更确切地说,全部设置为1s,所以32 1s),然后它说它是“从最低有效位(1)处理到最高有效位(128)”,但问题是,“最低…最高…有效位”是什么

块中其他数据的名称

如果数据块是以字节为单位设置的,并且只有32位,那么这是如何工作的呢?如果区块数据中有超过32位(肯定有吗?)

它是否表示“多项式”的“最小..最大..有效位”

但是多项式究竟代表什么呢?什么是x^32

x代表什么

对上述问题的任何帮助,以及一个简单的IDATA块示例(即使用基本解释计算CRC块)都将非常有用:

0 0 2 3 IDAT 0 1 0 1 0 1 0 1 0 1 0 C
最后一个字节“C”应该替换为它所说的32位CRC


有人能给我提供一个实用的例子吗?

该规范包含一个指向示例代码的链接:

规范有错误或混乱

这应该是“从最低有效位(0)到最高有效位(7)处理每个字节的数据”

CRC是一个33项多项式,其中每个项具有一位系数0或1,在描述多项式时忽略0系数

将CRC视为保存在32位寄存器中。序列是将一个字节的数据异或到CRC寄存器最右边的字节,即位7到0(技术上对应于x^24到x^31的多项式系数)。然后CRC向右“循环”8位(通过查表)。根据Mark Adler的注释,一旦所有数据字节都经过此循环,CRC将首先附加到数据最高有效字节(CRC>>24)&0xff,(CRC>>16)&0xff,(CRC>>8)&0xff,(CRC)&0xff

wiki文章可能会有所帮助。例如,在计算部分,红利将是一个数据字节数组,每个字节的位反转,33位多项式的位将不反转(0x104C11DB7)。完成计算后,剩余的位将反转并附加到数据字节中


马克·阿德勒的答案包括一个链接,指向一个很好的CRC教程。他的答案还解释了x在多项式中的用法。它就像代数中的多项式,只是系数只能是0或1,加法(或减法)使用XOR


什么是x

在wiki示例中:

data     = 11010011101100 = x^13 + x^12 + x^10 + x^7 + x^6 + x^5 + x^3 + x^2
divisor  =           1011 = x^3 + x + 1
将三个0位附加到数据,有效地将其乘以x^3:

dividend = 11010011101100000 = x^16 + x^15 + x^13 + x^10 + x^9 + x^8 + x^6 + x^5
然后crc=被除数%除数,系数限制为0或1

(x^16 + x^15 + x^13 + x^10 + x^9 + x^8 + x^6 + x^5) % (x^3 + x + 1) = x^2
11010011101100000 % 1011 = 100

我建议你阅读罗斯·威廉姆斯的经典著作。在这本书中,你会找到深入的解释和例子

多项式只是解释一串位的另一种方式。当寄存器中有n个位时,它们通常被解释为n个独立位的列表,或者被解释为整数,在整数中,将每个位乘以2,再加上0到n-1的幂在这里,您可以将每个位解释为多项式的系数。由于位只能是0或1,因此生成的多项式实际上不会显示0或1。取而代之的是xn项是否存在。因此,四位
1011
可以解释为1 x3+0 x2+1 x1+1 x0=x3+x+1。请注意,我选择最重要的是x3项的系数。这是一个任意的选择,我可以选择另一个方向

至于x是什么,它只是x的系数和幂的一个占位符。你从来没有将x设置为某个值,也没有确定关于x的任何内容。它所做的是允许你将这些位字符串作为多项式进行运算。当对这些多项式进行运算时,你将它们视为代数课上的多项式,除了系数被约束到域GF(2),其中系数只能是0或1。乘法成为and运算,加法成为异或运算。因此1加1等于0。您可以获得一种新的、不同的方法来对位串进行加法、乘法和除法。这种不同的方法是许多错误检测和纠正方案的关键

有趣的是,如果在一个位串的多项式表示中(通过正确的排序选择)将x设置为2,则可以得到该位串的整数解释。

注意:如果使用(00000000)\u 2和(00000001)_2作为示例IDAT块中0和1的二进制表示形式,您将错误地计算CRC。“0”和“1”的ASCII值分别为48=(00110000)和49=(00110001)sim