我在Perl中有一个以这种方式从模板读取数据包的函数:
sub read_packet {
my $contents = shift;
my @decode = unpack('nnnN', $contents);
my $version = $decode[0];
my $identifier = $decode[1];
my $type = $decode[2];
my $size = $decode [3];
@contents = ($version, $identifier, $type, $size);
return (@contents);
}
需要对拆包功能中的模板进行更改。现在$ identifier必须支持32位,因此根据PerlMonks:包装/拆包教程(又名系统如何存储数据)(N)-> n,NA以“网络”(大端)顺序排列的16/32位值。
因此,对该函数进行了小的更改就对其进行了重写。现在,发送“数据包”的程序可能正在发送16/32位值。客户要求我同时支持16/32位。我如何知道数据包何时包含16位或32位标识符?
如果这四个领域是所有分组包含,那么你可以检查的长度$contents
如果格式为,nnnN
则长度为2 + 2 + 2 + 4 = 10字节
如果格式为,nNnN
则长度为2 + 4 + 2 + 4 = 12字节
但是,如果在这四个字段之后有数据,则必须尝试使用最常见的unpack
模板并检查结果是否合理,如果失败,则使用备用模板
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句