объяснить следующий код Perl? - PullRequest
0 голосов
/ 12 июня 2011

Кто-нибудь может объяснить мне следующий код Perl, пожалуйста?Я думаю, что это на Perl, и я понятия не имею о программировании на Perl.Пожалуйста, объясните, что делает следующий код?

$t = test(10);
sub test() {
  my $str = unpack("B32", pack("N",shift));
  $str2 = substr($str,16,length($str));
  return $str2;
}

Ответы [ 4 ]

10 голосов
/ 12 июня 2011

Функции pack, unpack и substr документированы здесь , здесь и здесь соответственно.

pack("N"...) упаковывает числов четырехбайтовом представлении сетевого порядка.unpack("B32"...) распаковывает это упакованное число как строку битов (нулей и единиц).Вызов substr берет вторую половину этой битовой строки (начиная с 16-го бита), которая представляет младшие 16 битов исходного 32-битного числа.

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

sub test($) {
  return unpack("B16", pack("n",shift));
}
3 голосов
/ 12 июня 2011
shift

извлекает первый аргумент функции из списка переданных аргументов

pack("N", shift)

возвращает 32-битное сетевое представление порядка байтов этого значения

my $str = unpack("B32", pack("N", shift));

хранит представление цепочки битов (значение 32 бита) указанного значения (то есть строку, которая выглядит как "00010011").

substr содержит ошибки и должно быть substr($str, 16);, чтобы получить последние 16 символов из вышеперечисленного. (или substr($str, 16, 16);.)

1 голос
/ 12 июня 2011

В дополнение к ответу Марсело, функция shift принимает @_ в качестве аргумента по умолчанию.@_ содержит аргументы подпрограммы.

0 голосов
/ 12 июня 2011

pack("N", shift) принимает аргумент функции (возвращает значение shift, который по умолчанию работает с массивом arguments) и превращает его в целое число.Затем часть unpack("B32, снова превращается в строку, состоящую из 32 битов, то есть строку из 0 и 1.В этом случае substr принимает только последние 16 битовых символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...