/ / Jak podpisać rozszerzenie liczby całkowitej w perlu? - perl

Jak podpisać rozszerzenie liczby całkowitej w perlu? - perl

W moim kodzie czytam dane z tablicy 16-bitowych wartości, gdzie niektóre dane naprawdę zawierają podpisane 32-bitowe zmienne (z systemu big-endian). Więc zrobię coś takiego:

$value = $data[$i] << 16 | $data[$i+1];

Działa to dobrze w systemie 32-bitowym, ale kiedyuruchomiony w systemie 64-bitowym, będzie to interpretowane jako liczba dodatnia (uzupełnienie dwójkowe jako liczba 32-bitowa). Oczywiście mogę ręcznie sprawdzić, czy ustawiony jest najwyższy bit i odjąć go, ale robi się to trochę niezgrabnie, zwłaszcza że chciałbym, aby kod działał zarówno w systemach 32, jak i 64-bitowych. Czy istnieje prosty i dobry sposób na to?

Odpowiedzi:

5 dla odpowiedzi № 1

Użyję Pakiet i rozpakować dla tego:

my @data = (0x12, 0x3456);
my $i = 0;
my $value = unpack("l>", pack("n2", @data[$i, $i+1]));

Ma to tę zaletę, że można przetwarzać całą tablicę naraz:

my @values = unpack("l>*", pack("n*", @data));