最高有效位或最低有效位为 0 的 CRC32 密钥是否有效?
Could a CRC32 key with a most or least significant bit of 0 be valid?
我有一个服务器接收 UDP 数据包,其有效载荷是一些 CRC32 校验和的 4 字节字。每个 UDP 数据包中的 header 都有一个 2 字节的字段,其中包含用于有效负载中的单词的“重复”密钥。我的理解是,在 CRC32 中,密钥的二进制表示形式必须以 1 开头和结尾。换句话说,密钥的最低和最高有效位必须是 1 而不是 0。所以我的问题是,例如,我收到的第一个 UDP 数据包的密钥保存字段为 0x11BC,其二进制表示为 00010001 10111100。所以 1 既不与键保持字右对齐也不左对齐。两边都有尾随 0。那么我对有效 CRC32 密钥的理解是错误的吗?我问,因为我正在尝试编写代码以按原样使用密钥检查每个单词,它似乎总是给出余数,这意味着有效负载中的每个单词都有错误,但我得到的说明保证第一个给定示例中收到的数据包没有错误。
尽管 CRC 多项式确实总是设置最高位和最低位,但这通常是隐式处理的; 32 位 CRC 实际上是 33 位计算,指定的多项式通常会省略最高位。
例如CCITT CRC16 的标准引用多项式是 0x1021
,它没有设置最高位。
包含 LSB 是正常的,因此如果您确定知道指定了多项式的哪一种方式,那么应该设置字的最高位或最低位。
但是,出于 UDP 目的,您可能还在连接的一侧或另一侧出现了字节顺序错误?网络字节顺序传统上是大端,而今天的大多数处理器都是小端 — 是 link 切换字节顺序的一侧而不是另一侧吗?
我有一个服务器接收 UDP 数据包,其有效载荷是一些 CRC32 校验和的 4 字节字。每个 UDP 数据包中的 header 都有一个 2 字节的字段,其中包含用于有效负载中的单词的“重复”密钥。我的理解是,在 CRC32 中,密钥的二进制表示形式必须以 1 开头和结尾。换句话说,密钥的最低和最高有效位必须是 1 而不是 0。所以我的问题是,例如,我收到的第一个 UDP 数据包的密钥保存字段为 0x11BC,其二进制表示为 00010001 10111100。所以 1 既不与键保持字右对齐也不左对齐。两边都有尾随 0。那么我对有效 CRC32 密钥的理解是错误的吗?我问,因为我正在尝试编写代码以按原样使用密钥检查每个单词,它似乎总是给出余数,这意味着有效负载中的每个单词都有错误,但我得到的说明保证第一个给定示例中收到的数据包没有错误。
尽管 CRC 多项式确实总是设置最高位和最低位,但这通常是隐式处理的; 32 位 CRC 实际上是 33 位计算,指定的多项式通常会省略最高位。
例如CCITT CRC16 的标准引用多项式是 0x1021
,它没有设置最高位。
包含 LSB 是正常的,因此如果您确定知道指定了多项式的哪一种方式,那么应该设置字的最高位或最低位。
但是,出于 UDP 目的,您可能还在连接的一侧或另一侧出现了字节顺序错误?网络字节顺序传统上是大端,而今天的大多数处理器都是小端 — 是 link 切换字节顺序的一侧而不是另一侧吗?