Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > Путаница строк и чисел при побитовых операциях


Автор: SvetRus 14.9.2008, 19:51
Понадобилось портировать приложение с C++ в Perl. Столкнулся с неожиданной проблемой.
Код

//байтик
char a='q';
//ксорим его с маской
char a^=3;

Начал писать это в Perl'e
Код

$H=$H^6;

Отлаживаюсь - переменная ксорится не с 6, а с аскии кодом 6, т.е. с 0x36.
Порылся в мануале, нашёл функцию vXXX.YYY.ZZZ - сделал так:
Код

#некий оператор для позволяющий записать символ его кодом
my $q=v6;
#ксор
$H=$H^$q;

Вроде работает, хоть и через .... лишную переменную.
Дальше необходимо сделать побитовое И.
Код

//байтик
char a='q';
//пропускаем через маску
char a&=3;

Написал на Perl'e
Код

$n_shift&=4;

Таже проблема, операция проходит не с числом, а с символом '4'... сделал через переменную($q=v4) - стало сходиться с кодом на C++, но тут я столкнулся с проблемой - результат операции оказывается "строкой", а не числом. При попытке сравнить его в if($n_shift!=0)}else{} он всегда отправляет программу в else, хотя при распечатке лога работы(print в командную строку этой переменной) то "пустое место", символы.
Есть ли в Perl'e операторы позволяющие жестко обозначить в каком виде я хочу использовать переменную??? Или проще будет сделать Dll на С++ и её подшивать к Perl-у?
Последние часа 4 у меня ощущение, как будто я пытаюсь шурупы не закручивать шуруповёртом, а забивать им  smile 

Автор: ginnie 15.9.2008, 13:17
Уважаемый SvetRus, для Вашей задачи надо использовать функции pack() и unpack():

Код

unpack('C', pack('A', 'q') & pack('C', 6));

Автор: SvetRus 15.9.2008, 14:49
ginnie, большое спасибо, теперь буду закручивать шурупы, а не забивать!! smile 
Глянул мельком мануал - pack(), unpack() позволят решить путаницу с "типами" данных!!

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