我看到了一些实现,但我决定看看规范是如何调用 FCS 进行编码的。
所以说我的输入如下:
dst: 0xAA AA AA AA AA AA
src: 0x55 55 55 55 55 55
len: 0x00 04
msg: 0xDE AD BE EF
以似乎在格式中指定的顺序(以及稍后在规范中表达的顺序)连接它似乎表明我的输入是:
M(x) = 0xAA AA AA AA AA AA 55 55 55 55 55 55 00 04 DE AD BE EF
a) “帧的前 32 位被补码。”
complemented first 32 MSB of M(x): 0x55 55 55 55 AA AA 55 55 55 55 55 55 00 04 DE AD BE EF
b) “然后,受保护字段的 n 位被认为是 n – 1 次多项式 M(x) 的系数。(目标地址字段的第一位对应于 x(n–1) 项和MAC 客户端数据字段(或填充字段,如果存在)的最后一位对应于 x0 项。)"
我以前做过这个。见 M(x)
c) “M(x) 乘以 x^32 并除以 G(x),产生度数 <=31 的余数 R(x)。”
网上的一些选项似乎忽略了第 33 位来表示 x^32。我将忽略本练习的那些简化快捷方式,因为它似乎没有在规范中指定。它说将 M(x) 乘以 x^32。所以这只是在 LSB 上填充 32 个零。(即如果m(x) = 1x^3 + 1
,那么m(x) * x^2 = 1x^5 + 1x^2 + 0
)
padded: 0x55 55 55 55 AA AA 55 55 55 55 55 55 00 04 DE AD BE EF 00 00 00 00
下一步是划分。我正在划分整个 M(x) / G(x)。可以直接使用异或移位吗?我看到一些二进制除法示例的除数为 101,除数为 110,余数为 11。其他示例说明通过转换为十进制,您不能除法。该标准的术语是哪一个?
我的余数结果是选项 1(使用 XOR 而不考虑进位、移位、无填充)是:
0x15 30 B0 FE
d) “R(x) 的系数被认为是一个 32 位序列。”
e) “位序列被补码,结果是CRC。”
CRC = 0xEA CF 4F 01
所以我的整个以太网帧应该是:
0xAA AA AA AA AA AA 55 55 55 55 55 55 00 04 DE AD BE EF EA CF 4F 01
其中我的 dst 地址是它的原始值。
当我使用在线 CRC32 BZIP2 计算器检查我的工作时,我看到了以下结果:0xCACF4F01
是否有其他选项或在线工具来计算以太网 FCS 字段?(不仅仅是众多 CRC32 计算器之一)
我错过了哪些步骤?我应该填充 M(x) 吗?我应该补充 32 个 LSB 吗?
更新
我的软件中的 CRC 输出出现错误。复制矢量是一个小问题。我对 CRC 的最新结果是(补码前)35 30 B0 FE
。
后补是:(CA CF 4F 01
匹配大多数在线 CRC32 BZIP2 版本)。
所以根据我的编程,我的以太网目前是:
0xAA AA AA AA AA AA 55 55 55 55 55 55 00 04 DE AD BE EF CA CF 4F 01