Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что это за тип данных? 
:(
    Опции темы
failed
Дата 6.2.2011, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.2.2011

Репутация: нет
Всего: нет



Здравствуйте! 
Моему скрипту (модуль для фрирадиуса) передается некторое значение, которое должно по идее выглядеть так:

Код

Data:   Type=0 Len=4  VID  Module Port
       +------+-----+-----+------+----+
Bytes: |   1  |  1  |  2  |   1  |  1 |
       +------+-----+-----+------+----+
(Values in HEX)


Мне необходимо получить отдельно три последних значения.

Исходными данные по идее должны быть:
00 04 03E8 01 04

Скрипту значение передается, однако вот тут я не совсем могу понять. Судя по всему перл как-то сразу переделывает его в строку, потому что если вывести его на экран получается "\000\004\003\350\001\004" , причем это и есть строка судя по тому, что у нее length возвращает 24, и ее спокойно можно разбить сплитом по "\". 

Отсюда вопрос - исходные данные уже "испорчены", и их нужно парсить вручную как строку, или это перл воспринимая содержимое октетов как строку, занимается подменой нелегальных символов на их восьмеричное представление? Спасибо!
PM MAIL   Вверх
Pfailed
Дата 6.2.2011, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



$ echo -ne "\05" | perl -ne "warn '[', $_, '] ', length, ' ', ord, ' ', unpack('C')"
[] 1 5 5 at -e line 1, <> line 1.

Если приходит набор байтов, он и остаётся набором байтов, perl ничего с ней сам не делает.


--------------------
PM MAIL   Вверх
failed
Дата 8.2.2011, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.2.2011

Репутация: нет
Всего: нет



Спасибо за ответ, действительно мне приходит уже готовая строка вида '\000\004\003\350\001'...
Причем в случае совпадения октета с реальным кодом символа, печатается сам символ, что в принципе мне и надо, поэтому я недолго думая сделал так:
Код

$str =~ s/(\\\d{3})/chr(oct(substr($1,1,3)))/ge;

И все было хорошо, пока мне не попалась вот такая штука:
"\000\004\003\350\001\n"
которая снова испортила мне всю малину... Понятно, что \n = 10, сделал "второй проход" на замену служебных символов, но что-то мне всеравно неспокойно, вдруг есть какой-нибудь \+100500 одному перлу известный, или еще какой нюанс вылезет.

Нельзя ли как-нибудь стандартными методами преобразовать все "развернутые" \xxx и служебные символы (вроде \n) в строке в их родное значение? Спасибо! 


PM MAIL   Вверх
Pfailed
Дата 8.2.2011, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Оттолкнуться можно от того, что escape последовательности интерполируются в двойных кавычках. С помощью eval есть возможность получить нужное значение, но это как известно не очень хорошо с точки зрения безопасности. С другой стороны простой регуляркой можно отфильтровать опасные данные.
Кажется такая конструкция должна работать:
Код

if($str =~ /^(?:\\[0-9a-z]{1,3})+$/) {
   $str = eval "\"$str\"";
}




--------------------
PM MAIL   Вверх
arto
Дата 8.2.2011, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



perldoc -f pack
perldoc -f unpack
PM MAIL ICQ   Вверх
failed
Дата 8.2.2011, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.2.2011

Репутация: нет
Всего: нет



Цитата(Pfailed @  8.2.2011,  16:57 Найти цитируемый пост)
Оттолкнуться можно от того, что escape последовательности интерполируются в двойных кавычках. С помощью eval есть возможность получить нужное значение, но это как известно не очень хорошо с точки зрения безопасности. С другой стороны простой регуляркой можно отфильтровать опасные данные.Кажется такая конструкция должна работать:код Perl1:2:3:if($str =~ /^(?:\\[0-9a-z]{1,3})+$/) {   $str = eval "\"$str\"";}


Спасибо, подобный подход сработал на ура!


Цитата(arto)
perldoc -f pack
perldoc -f unpack


Я про них думал, но, к сожалению, не смог найти способ преобразовать escape последовательность в ее код анпаком. Буду благодарен, если вы приведете подобный пример!


PM MAIL   Вверх
arto
Дата 8.2.2011, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



... и ник у вас подходящий.

CCSCC

PM MAIL ICQ   Вверх
failed
Дата 8.2.2011, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.2.2011

Репутация: нет
Всего: нет



Цитата(arto @ 8.2.2011,  21:47)
... и ник у вас подходящий.

CCSCC

Аа, вы об этом. Спасибо, но ваше решение совершенно не от моих вопросов. Ну, тоесть, я так и делаю, но уже после всех действий о которых шла речь в этой теме. Боюсь вы просто не вчитались в суть первого поста и последующего уточнения.

А ник да, мне подходит smile
PM MAIL   Вверх
arto
Дата 9.2.2011, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



как знаете.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0483 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.