| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Общие вопросы > Использование pack unpack |
| Автор: justauser 28.9.2014, 10:11 | ||
Что то я не соображу как распаковать на 2е переменных 1 байт состоящий из двух половинок по 4 бита или любой другой вариант 6+2 или 3+5 бит. Понятно как можно распаковать на байты
а как распаковать на ($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 | ||
Оно?
|
| Автор: Pfailed 28.9.2014, 19:39 | ||
Ещё вариант
|
| Автор: 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 |
| Идею понял, спасибо. |