2010-01-21 15 views
11

Bir Perl betiği tarafından ayrıştırılan günlük dosyalarında onaltılık dizeler olarak temsil edilen bir grup sayım var ve Perl ile göreceli olarak deneyimsiz durumdayım. Bu sayılardan bazıları, 16 bit imzalı bir tamsayı olarak gösterildiğinde, aslında negatif sayılar, yani 0xFFFE == -2 imzalıdır.Dizelerdeki onaltılık sayıları negatif sayılara dönüştürme, Perl

Biri bana Perl'deki FFFE dizesinden bu numaran imzalı temsilini alma şeklindeki kurallı yolunu söyler misiniz, yoksa bir öğretici mi yoksa başka bir kaynağa mı işaret eder?

+5

Sadece FWIW, en az 2's tamamlayıcısı, FFFE -2 - FFFF -1'dir. –

+0

Err, whoops. Kesinlikle haklısın, düşünmüyordum. –

cevap

20

Onaltılıktan onluya dönüştürmek için hex() işlevini kullanabilirsiniz, ancak girişi imzasız bir değer olarak yorumlar. Bunu telafi etmek için, işaretsiz miktar olarak ondalık değer paketi ve imzalı biri olarak açmak:

my $num = unpack('s', pack('S', hex('FFFE'))); 

's' ve 'S' şablonlar, imzalı ve imzasız 16 bit miktarlar içindir sırasıyla. Diğer şablonlar ve kullanım bilgileri için pack işlevinin belgelerine bakın.

+4

Daha çok insanın paketi hakkında bilgi sahibi olmasını isterdim. Bu harika bir araç. :) –

+0

Şimdi en az bir tane daha var. Tam olarak ihtiyacım olan buydu, çok teşekkürler Michael. –

1
print unpack('s>', pack('H4', 'FFFE')); 
-2