2011-11-30 29 views
2

的長度考慮這個簡單的例子:現在的Perl包/解包和二進制字符串

$a = pack("d",255); 
print length($a)."\n"; 
# Prints 8 

$aa = pack("ddddd", 255,123,0,45,123); 
print length($aa)."\n"; 
# Prints 40 

@unparray = unpack("d "x5, $aa); 
print scalar(@unparray)."\n"; 
# Prints 5 

print length($unparray[0])."\n" 
# Prints 3 

printf "%d\n", $unparray[0] ' 
# Prints 255 

# As a one-liner: 
# perl -e '$a = pack("d",255); print length($a)."\n"; $aa = pack("dd", 255,123,0,45,123); print length($aa)."\n"; @unparray = unpack("d "x5, $aa); print scalar(@unparray)."\n"; print length($unparray[0])."\n"; printf "%d\n", $unparray[0] ' 

,我期望一個雙精度浮點是八個字節,所以第一個length($a)是正確的。但是爲什麼解壓縮後的長度(length($unparray[0]))報告3 - 當我試圖返回完全相同的方式(雙精度,即8個字節)並且項目(255)的值被正確保存?

回答

5

通過打開包裝的內容,您已恢復原始值,並且第一個值爲255. 255的字符串爲「255」,長度爲3個字符,這就是length告訴您的值。

+0

感謝那@hobbs;包從整數變成「double-value packed bytestring」;和其他方式(解壓縮),我希望以某種方式從「double-value packed bytestring」中獲得雙精度浮點數在$'unparray'中;但它似乎是'$ unparray'中的字符串!感謝您澄清這一點 - 歡呼! – sdaau

+4

@sdaau,你可以在'@ unparray'中獲得雙精度浮點數。 'length'找到字符串的長度,所以它需要一個字符串,所以如果需要的話它會將其參數串聯起來。 – ikegami

+0

感謝那@ikegami - 「'長度'發現字符串的長度」似乎是我未能理解的絆腳石。乾杯! – sdaau

相關問題