Perl Pack и распаковывать функции - PullRequest
1 голос
/ 14 января 2012

Я пытаюсь распаковать переменную, содержащую строку, полученную из анализатора спектра :# 42404 û ¢ - + A ¢ ¢ -Va -oÆ ¢ ¢ -8æ -be ¢ ¢ -ой - + A ¢ - Ö ¢ -se ¢ ¢ -UO -|ö ¢ - = Æ ¢ -8æ ¢ -uô ¢ - = Æ ¢ - \ Å ¢ -uô ¢ -? ü ¢ -} ¦ ¢ - = Æ ¢ -) ...

Формат действительный 32, который использует четыре байта для хранения каждого значения.Число # 42404 представляет 4 дополнительных байта и 2404/4 = 601 набранных очков.Данные начинаются после # 42404.Теперь, когда я получаю это в строковую переменную,

$lp = ibqry($ud,":TRAC:DATA? TRACE1;*WAI;");

Я не уверен, как преобразовать это в массив чисел: (... Должен ли я использовать что-то вроде следующего?

@dec = unpack("d", $lp);

Я знаю, что это не работает, потому что я не получаю правильные значения и число точек данных наверняка не 601 ...

Ответы [ 2 ]

4 голосов
/ 14 января 2012

Во-первых, вы должны удалить #42404 и надеяться, что ни один из следующих двоичных данных не будет числом ASCII.

$lp =~ s{^#\d+}{};

Я не уверен, что формат "Real 32", но я собираюсь догадаться, что это с плавающей запятой одинарной точности длиной 32 бита.Глядя на пакет документов .d - это число с плавающей запятой двойной точности, то есть 64 бита.Поэтому я бы попробовал f, что означает "одинарную точность".

@dec = unpack("f*", $lp);

Является ли ваша информация большой или младший - это проблема.d и f используют собственный порядок байтов вашего компьютера.Возможно, вам придется принудительно использовать порядковый номер, используя модификаторы > и <.

@dec = unpack("f*>", $lp);  # big endian
@dec = unpack("f*<", $lp);  # little endian
1 голос
/ 14 января 2012

Если первая 4 кодирует количество оставшихся цифр (2404) перед плавающей точкой, то может сработать что-то подобное:

my @dec = unpack "x a/x f>*", $lp;

x пропускает ведущий #, a/x читает одну цифру и пропускает столько символов после него, а f>* анализирует оставшуюся строку как последовательность 32-битных чисел с обратным порядком байтов. (Если вывод выглядит странно, попробуйте вместо этого использовать f<*.)

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