/ / Konwersja liczb szesnastkowych w łańcuchach na liczby ujemne, w Perl - perl, parsowanie, liczby, podpis

Konwertowanie liczb szesnastkowych w ciągi na liczby ujemne, w Perl - perl, parsowanie, liczby, podpisane

Mam kilka liczb reprezentowanych jako ciągi szesnastkowe w plikach dziennika, które są analizowane przez skrypt Perla, a ja jestem stosunkowo niedoświadczony w Perlu.

Niektóre z tych liczb są faktycznie oznaczone liczbami ujemnymi, tj. 0xFFFE == -2 gdy jest reprezentowana jako 16-bitowa liczba całkowita ze znakiem.

Czy ktoś może mi powiedzieć, kanoniczny sposób uzyskania podpisanej reprezentacji tego numeru z ciągu FFFE w Perlu, lub w inny sposób wskaż mi samouczek lub inny zasób?

Odpowiedzi:

20 dla odpowiedzi nr 1

Możesz użyć klątwa() funkcja konwersji z szesnastkowej na dziesiętną, ale interpretuje dane wejściowe jako niepodpisaną wartość. Aby to zrekompensować, spakuj wartość dziesiętną jako niepodpisaną liczbę i rozpakuj ją jako podpisaną:

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

Szablony "s" i "S" dotyczą odpowiednio liczby 16-bitowej ze znakiem i bez znaku. Zobacz dokumentację dla pack funkcja dla innych szablonów i informacji o użytkowaniu.


1 dla odpowiedzi nr 2
print unpack("s>", pack("H4", "FFFE"));
-2