加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl按位AND和按位移位

发布时间:2020-12-16 06:28:13 所属栏目:大数据 来源:网络整理
导读:我正在阅读模块 Net::Pcap::Easy 的一些示例代码片段,我遇到了这段代码 my $l3protlen = ord substr $raw_bytes,14,1;my $l3prot = $l3protlen 0xf0 2; # the protocol partreturn unless $l3prot == 4; # return unless IPv4my $l4prot = ord substr $packe
我正在阅读模块 Net::Pcap::Easy的一些示例代码片段,我遇到了这段代码

my $l3protlen = ord substr $raw_bytes,14,1;
my $l3prot = $l3protlen & 0xf0 >> 2;    # the protocol part
return unless $l3prot == 4;    # return unless IPv4
my $l4prot = ord substr $packet,23,1;
return unless $l4prot == '7';

在对原始数据包$raw_bytes进行总十六进制转储后,我可以看到这是一个以太网帧,而不是TCP / UDP数据包.有人可以解释一下上面的代码是做什么的吗?

解决方法

为了解析帧,我查了 this page.

现在进入Perl ……

my $l3protlen =  ord substr $raw_bytes,1;

从$raw_bytes中提取第15个字节(字符),并转换为其序数值(例如,字符“A”将转换为整数65(0x41),假设字符集为ASCII).这就是Perl如何处理二进制数据,就好像它是一个字符串(例如将其传递给substr),然后让你将二进制值取回并将它们作为数字处理. (但请记住TMTOWTDI.)

在IPv4帧中,前14个字节是MAC头(目标和源MAC地址各6个字节,后面是2字节的Ethertype,可能是0x8000 – 您可以检查这个).在此之后,第15个字节是以太网数据有效载荷的开始:它的第一个字节包含Version(高4字节)和DWORD中的Header Length(低4字节).

现在它看起来像这个示例代码的下一行中有一个错误,但它通常可以通过侥幸工作!

my $l3prot    = $l3protlen & 0xf0 >> 2; # the protocol part

在Perl中,>>优先级高于&,所以这相当于

my $l3prot    = $l3protlen & (0xf0 >> 2);

或者如果你愿意的话

my $l3prot    = $l3protlen & 0x3c;

因此,这从$l3prot值中提取位2-5:掩码值0x3c是二进制的0011 1100.因此,例如,值0x86(二进制,1000 0110)将变为0x04(二进制0000 0100).
实际上,“正常”IPv4值是0x45,即协议类型4,报头长度为5个双字.掩盖与0x3c,你得到… 4!但只有侥幸:你已经测试了长度的前2位,而不是协议类型!

这条线肯定是

my $l3prot = ($l3protlen & 0xf0) >> 4;

(注意优先级的括号和4位的移位,而不是2位). (我在CPAN documentation中发现了同样的错误,所以我猜它可能已经广泛传播了.)

return unless $l3prot == 4; # return unless IPv4

对于IPv4,我们希望这个值为4 – 如果不是,立即跳出函数. (因此上面的错误代码给出了结果,这可以将其解释为IPv4数据包,但仅限运气.)

my $l4prot = ord substr $packet,1;

现在提取第24个字节并以相同的方式转换为序数值.这是来自IP标头的协议字节:

return unless $l4prot == '7';

我们希望这是7 – 如果它没有马上跳出功能. (根据IANA,7是“基于核心的树”……但我猜你知道你感兴趣的协议!)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读