Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Использование pack unpack


Автор: justauser 28.9.2014, 10:11
Что то я не соображу как распаковать на 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 бит)? И как их запаковывать?

Автор: arto 28.9.2014, 11:01
самое простое -- вручную

Автор: justauser 28.9.2014, 12:16
А если серьезно? Я читал http://perldoc.perl.org/functions/pack.html и http://perldoc.perl.org/functions/unpack.html не помогает. Мне нужно из одного байта сделать два: взять 3 младших бита дополнить 0 до 8 и присвоить переменной дальше взять оставшиеся 5 опять дополнить 0 в старших разрядах и это вторая переменная. Не соображу как. Можно пример?

Автор: Pfailed 28.9.2014, 19:20
Оно?
Код

my $byte = chr(0b11011011);

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

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

Автор: Pfailed 28.9.2014, 19: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;


Автор: arto 28.9.2014, 20:10
зачем так сложно?

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

Автор: Pfailed 28.9.2014, 20:49
Так то тут тоже самое написано

Автор: arto 28.9.2014, 21:49
без chr и ord

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

Автор: arto 29.9.2014, 08:00
# perl -le '$a = ( unpack ("C S C", pack ("H*", "a5a5b6b6")))[0]; printf "%b, %b\n", $a & 0b00000111, $a >> 3'   
101, 10100

Автор: justauser 30.9.2014, 14:38
Идею понял, спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)