小编seb*_*ebs的帖子

以太网CRC32计算 - 软件与算法结果

我正在尝试逐字节计算以太网数据包的帧校验序列(FCS).多项式是0x104C11DB7.我确实遵循了这里所见的XOR-SHIFT算法http://en.wikipedia.org/wiki/Cyclic_redundancy_checkhttp://www.woodmann.com/fravia/crctut1.htm

假设假定具有CRC的信息仅为一个字节.假设它是0x03.

  1. 步骤:向右打32位

    0x0300000000

  2. 将多项式和左侧的数据与它们的第一个非零和xor对齐

    0x300000000 xor 0x209823B6E = 0x109823b6e

  3. 取余数对齐和xor

    0x109823b6e xor 0x104C11DB7 = 0x0d4326d9

由于没有剩下的位,0x03的CRC32应该是 0x0d4326d9

不幸的是,所有的软件实现都告诉我我错了,但是我做错了什么或者他们做了什么不同的事情?

Python告诉我:

 "0x%08x" % binascii.crc32(chr(0x03))
 0x4b0bbe37
Run Code Online (Sandbox Code Playgroud)

这里的在线工具http://www.lammertbies.nl/comm/info/crc-calculation.html#intr获得了相同的结果.我的手计算与上述软件使用的算法有什么区别?

更新:

事实证明堆栈溢出已经存在类似的问题:

你在这里找到一个答案Python CRC-32的问题

虽然这不是很直观.如果您想要更正式地描述如何为以太网帧完成,您可以查看以太网标准文档802.3第3部分 - 第3.2.9章帧校验序列字段

让我们继续上面的例子:

  1. 反转邮件的位顺序.这代表了他们逐点进入接收器的方式.

    0x03 因此是 0xC0

  2. 补充邮件的前32位.请注意,我们再次使用32位填充单个字节.

    0xC000000000 xor 0xFFFFFFFF = 0x3FFFFFFF00

  3. 再次完成上面的Xor和shift方法.大约6步之后你得到:

    0x13822f2d

  4. 然后补充上述比特序列.

    0x13822f2d xor 0xFFFFFFFF = 0xec7dd0d2

  5. 请记住,我们颠倒了位顺序,以便在第一步中获得以太网线上的表示.现在我们必须扭转这一步,我们终于完成了我们的任务.

    0x4b0bbe37

想出这种做法的人应该......

很多时候你真的想知道你收到的信息是正确的.为了达到这个目的,您可以收到包括FCS在内的收到的消息,并执行与上述相同的步骤1到5.结果应该是他们所谓的残留物.这是给定多项式的常数.在这种情况下它是0xC704DD7B.

正如mcdowella所提到的那样,你必须玩弄你的位,直到你做对了,这取决于你正在使用的应用程序.

python algorithm crc32 ethernet

12
推荐指数
2
解决办法
2万
查看次数

使用tcl在Modelsim中查找特定信号何时具有特定值

我正在尝试加快调试速度。在较大的跟踪中,我正在搜索信号的特定值。我在Linux下使用QuestaSim 10.0b。

我已经发现可以使用以下命令在Modelsim / QuestaSim中完成

searchlog -expr { stream == 'h20 } 0
Run Code Online (Sandbox Code Playgroud)

不幸的是,当它的值为“ XX”时,它也与信号“流”匹配,但我只希望它与0x20匹配。如何确定它仅匹配十六进制值,而不匹配未定义的值?

tcl modelsim questasim

6
推荐指数
1
解决办法
1815
查看次数

无法加载证书6300:错误:0906D06C:PEM例程:PEM_read_bio:无起始行

当我运行以下命令检查我的私钥PEM文件时,会弹出一个错误

unable to load certificate 6300:error:0906D06C:PEM routines:PEM_read_bio:no start line:.\crypto\pem\pem_lib.c:703:Expecting: TRUSTED CERTIFICATE

command : C:\>openssl x509 -in C:\private-key.pem -text -noout

任何的想法?

openssl ssl-certificate private-key

6
推荐指数
1
解决办法
3万
查看次数

将事件绑定到单个字符 tcl/tk

我正在尝试在小部件中显示二进制信息(即文本、条目、标签)。单个字符,在这种情况下,只有“0”或“1”应该是可点击的,以便它们在 0 和 1 之间切换。

我不太确定要使用哪个小部件以及如何将鼠标事件绑定到单个字符。

我希望有人能指出我正确的方向,因为我对 TK 方面还很陌生。

tk-toolkit tcl widget

2
推荐指数
1
解决办法
404
查看次数

用于VHDL字符串文字的正则表达式

我正在尝试解析我的VHDL代码以进行一些额外的检查.

我正在寻找一个寻找字符串文字的正则表达式.字符串文字用双引号括起来,如下所示:

" {characters} "
Run Code Online (Sandbox Code Playgroud)

目前的问题是以下要求:

如果要在字符值序列中表示引号值,则必须在字符串文字内的相应位置写入一对相邻的引号.

这意味着以下是合法的字符串文字:

""""  
" random stuff "" random stuff "  
Run Code Online (Sandbox Code Playgroud)

我不确定是否:

("(("")*[^\n"]*)*")
Run Code Online (Sandbox Code Playgroud)

充分涵盖它

regex vhdl

1
推荐指数
1
解决办法
1180
查看次数