我在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);
}
在unpack函数中需要对模板进行更改。现在**$identifier**必须支持32位,因此根据PerlMonks:* Pack/Unpack Tutorial (aka How the System Stores Data) *(N)-〉n,N一个16/32位值,按“网络”(大端)顺序。
所以这个函数被重写做这个小的变化。现在,发送“数据包”的程序可以发送16/32位值。客户要求我支持16/32位。当一个数据包包含16或32位标识符时,我该怎么做?
2条答案
按热度按时间dsekswqp1#
如果这四个字段是包中包含的所有字段,则可以检查
$contents
的长度nnnN
,则长度为2 + 2 + 2 + 4 = 10字节nNnN
,则长度为2 + 4 + 2 + 4 = 12字节但是,如果这四个字段后面有数据,则必须尝试最常用的
unpack
模板并检查结果是否正确,如果失败,则使用备用模板。sauutmhj2#
当协议以不兼容的方式更改时,版本也应该更改。如果是这样,您可以使用以下方法:
否则,您将基于数据包的大小。然而,这需要传输的数据包的大小,并不总是如此。幸运的是,它确实出现在这里,所以您可以使用以下内容: