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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование pack unpack 
:(
    Опции темы
justauser
Дата 28.9.2014, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Что то я не соображу как распаковать на 2е переменных 1 байт состоящий из двух половинок по 4 бита или любой другой вариант 6+2 или 3+5 бит. Понятно как можно распаковать на байты

Код

my ($var1,$var2,$var3,$var4,$var5);
my $fourbytes;
$fourbytes = pack ("H*", "a5a5b6b6");

($var1,$var2,$var3) = unpack ("a S a", $fourbytes);

а как распаковать на ($var1,$var2,$var3,$var4,$var5)если первый байт содержит две переменных (4+4 бит) и последний тоже (2+6 бит)? И как их запаковывать?

Это сообщение отредактировал(а) justauser - 28.9.2014, 10:15
PM MAIL   Вверх
arto
Дата 28.9.2014, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



самое простое -- вручную
PM MAIL ICQ   Вверх
justauser
Дата 28.9.2014, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А если серьезно? Я читал http://perldoc.perl.org/functions/pack.html и http://perldoc.perl.org/functions/unpack.html не помогает. Мне нужно из одного байта сделать два: взять 3 младших бита дополнить 0 до 8 и присвоить переменной дальше взять оставшиеся 5 опять дополнить 0 в старших разрядах и это вторая переменная. Не соображу как. Можно пример?
PM MAIL   Вверх
Pfailed
Дата 28.9.2014, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Оно?
Код

my $byte = chr(0b11011011);

my $first  = vec($byte, 0, 4);
my $second = vec($byte, 1, 4);

printf "first = %b; second = %b\n", $first, $second;



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


Опытный
**


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

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



Ещё вариант
Код

my $byte = chr(0b11011101);

my $first_three_bits = ord($byte) & 0b00000111;
my $last_five_bits = ord($byte) >> 3;

printf "first = %b; last = %b\n", $first_three_bits, $last_five_bits;



Это сообщение отредактировал(а) Pfailed - 28.9.2014, 19:41


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


Эксперт
***


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

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



зачем так сложно?

# perl -le 'printf "%b, %b\n", $ARGV[0] & 0b00000111, $ARGV[0] >> 3' $[ 0xdd ]
101, 11011

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


Опытный
**


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

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



Так то тут тоже самое написано


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


Эксперт
***


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

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



без chr и ord
PM MAIL ICQ   Вверх
Pfailed
Дата 29.9.2014, 06:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ТС байт не числом приходит, а в бинарном виде, что и возвращает chr().


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


Эксперт
***


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

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



# perl -le '$a = ( unpack ("C S C", pack ("H*", "a5a5b6b6")))[0]; printf "%b, %b\n", $a & 0b00000111, $a >> 3'   
101, 10100

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


Новичок



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

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



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


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

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


 




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


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

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