2016-01-21 66 views
2

我在Perl的功能,以這種方式讀取模板包:解壓功能要求在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); 
} 

的變化被要求在解包功能的模板。現在$標識符必須支持32位,所以根據PerlMonks:Pack/Unpack Tutorial (aka How the System Stores Data)(N) - > n,N在「網絡」(大端)順序中的A 16/32比特值。

因此,函數被重寫,做了這個小小的改變。現在,發送「數據包」的程序可能會發送16/32位值。 客戶要求我支持16/32位。當數據包包含16或32位標識符時,我該怎麼做?

+0

檢查數據包的大小? – choroba

+0

@choroba,我無法找到該文件,pelase,你可以指點我的文檔。 – crsuarezf

回答

5

如果這些四個字段是所有分組包含然後可以檢查的$contents

  • 長度如果格式是nnnN則長度將是2 + 2 + 2 + 4 = 10字節

  • 如果格式是nNnN則長度將是2 + 4 + 2 + 4 = 12字節

但是,如果有數據下面這四個領域,那麼你必須嘗試的最常用unpack模板,檢查結果爲理智,使用替代模板,如果它失敗

2

當協議不兼容的方式改變,版本應該也改變了。如果是這樣,您可以使用以下內容:

sub read_packet { 
    my $contents = shift; 
    (my $version, $contents) = unpack('na*', $contents); 

    if ($version < X) { 
    return ($version, unpack('nnN', $rest)); 
    } else { 
    return ($version, unpack('NnN', $rest)); 
    } 
} 

否則,您將擁有基於它的數據包大小。但是,這要求傳輸數據包的大小,並非總是如此。幸運的是,它確實出現在這裏,因此您可以使用以下內容:

sub read_packet { 
    my $contents = shift; 
    return unpack(length($contents) < 12 ? 'nnnN' : 'nNnN', $contents); 
}