为什么 CRC32 在 gnuradio 中是非线性的?
why CRC32 is non-linear in gnuradio?
我有一个关于 gnuradio 中 CRC32 非线性的问题。
我正在做一个项目,我需要一个线性 CRC32,这意味着:crc(a xor b) = crc(a) xor crc(b),其中 a 和 b 代表一个数据包。
默认情况下,gnuradio 中 CRC32 的实现是非线性的,因此我不得不修改代码以使其成为线性的。
我对 CRC 背后的理论进行了一些研究,发现了非线性 CRC 实现背后的两个原因:
1- 使用线性 CRC,我们可以对 2 个不同的零数据包使用相同的 CRC,例如 crc(0000 0000) = crc(00000 00 00000)。因此,如果我向仅包含零的数据包添加额外的零,那么 CRC 将无法检测到错误(额外的零)。
2- 第二个原因是使用线性 CRC,如果我在数据包的开头添加零,CRC 将无法检测到错误。例如:crc(10010 1101) = crc(0000 1000 1101)
现在我的问题是:
当在两个 USRP 之间传输数据包时,位可能有错误(例如由于 SNR 差),所以位“1”可能变成位“0”,反之亦然。但是,我不认为可以向数据包添加位(如上述两种情况),因此实现非线性 CRC 的原因不适用于 gnuradio。
那么为什么默认情况下我们在 gnuradio 中有一个非线性 CRC?
而且,如果我在两个 USRP 之间传输时使用线性 CRC,会有问题吗?
谢谢,
这样的 CRC 仍然是线性的,只是增加了一个常数。作为类比,y = a x
是线性的,但 y = a x + b
也是线性的,其中 b
是一个非零常数。
在这种情况下,crc(a xor b) xor crc(a) xor crc(b)
是所有等长消息 a
和 b
的常量。该常数是 crc(0)
,即相同消息长度的所有零的 CRC。
这种线性绝对没有问题,而且还有好处。特别是,消息中添加零前缀的更改将被检测为错误。
我有一个关于 gnuradio 中 CRC32 非线性的问题。
我正在做一个项目,我需要一个线性 CRC32,这意味着:crc(a xor b) = crc(a) xor crc(b),其中 a 和 b 代表一个数据包。
默认情况下,gnuradio 中 CRC32 的实现是非线性的,因此我不得不修改代码以使其成为线性的。
我对 CRC 背后的理论进行了一些研究,发现了非线性 CRC 实现背后的两个原因:
1- 使用线性 CRC,我们可以对 2 个不同的零数据包使用相同的 CRC,例如 crc(0000 0000) = crc(00000 00 00000)。因此,如果我向仅包含零的数据包添加额外的零,那么 CRC 将无法检测到错误(额外的零)。
2- 第二个原因是使用线性 CRC,如果我在数据包的开头添加零,CRC 将无法检测到错误。例如:crc(10010 1101) = crc(0000 1000 1101)
现在我的问题是: 当在两个 USRP 之间传输数据包时,位可能有错误(例如由于 SNR 差),所以位“1”可能变成位“0”,反之亦然。但是,我不认为可以向数据包添加位(如上述两种情况),因此实现非线性 CRC 的原因不适用于 gnuradio。
那么为什么默认情况下我们在 gnuradio 中有一个非线性 CRC?
而且,如果我在两个 USRP 之间传输时使用线性 CRC,会有问题吗?
谢谢,
这样的 CRC 仍然是线性的,只是增加了一个常数。作为类比,y = a x
是线性的,但 y = a x + b
也是线性的,其中 b
是一个非零常数。
在这种情况下,crc(a xor b) xor crc(a) xor crc(b)
是所有等长消息 a
和 b
的常量。该常数是 crc(0)
,即相同消息长度的所有零的 CRC。
这种线性绝对没有问题,而且还有好处。特别是,消息中添加零前缀的更改将被检测为错误。