Как мне подписать расширение целого числа в Perl? - PullRequest
6 голосов
/ 15 июня 2011

В моем коде я читаю данные из массива 16-битных значений, где некоторые данные действительно содержат 32-битные переменные со знаком (из системы с прямым порядком байтов). Поэтому я сделаю что-то вроде:

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

Это прекрасно работает в 32-битной системе, но при работе в 64-битной системе это будет интерпретироваться как положительное число (дополнение к двойкам как 32-битное число). Конечно, я могу вручную проверить, установлен ли старший бит, и вычесть, но это становится немного неуклюжим, тем более, что я хотел бы, чтобы код работал как на 32, так и на 64-битных системах. Есть ли простой и хороший способ сделать это?

1 Ответ

5 голосов
/ 15 июня 2011

Я бы использовал pack и unpack для этого:

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

Преимущество состоит в том, что вы можете обрабатывать весь массив одновременно:

my @values = unpack('l>*', pack('n*', @data));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...