2015-09-19 2 views
0

Я портировал скрипт из Perl в PHP, и у меня есть ошибки. Следующий код возвращает другой результат для одних и тех же входных данных. Скорее строка возвращается на Perl в 2 раза дольше, чем строка в PHP, но начало этой строки совпадает с линией PHP. Я ожидаю, что он закодировал строки ввода, но я не могу понять до конца.Различное поведение оператора^в PHP и Perl

$test = $password^$newchal; 

Пожалуйста, помогите мне, чтобы получить такое же значение $test в PHP, как и в Perl?

+0

ли обе переменные строки? – Rizier123

+0

Да! Обе переменные - это строки. – Buboon

+0

Что такое ** точный вывод **: var_dump ($ password); 'и' var_dump ($ newchal); '? – Rizier123

ответ

4

Определенное поведение языков представляется различным.

For Perl:

Если операнды бинарной побитового цит являются строками разных размеров, | и^опс действовать, как если бы короче операнд имел дополнительные нулевые биты на правой

PHP documentation не кажется, чтобы определить, что происходит в этом случае, но один из примеров дает его прочь:

echo "12"^"9"; // Outputs the Backspace character (ascii 8) 
       // ('1' (ascii 49))^('9' (ascii 57)) = #8 

Итак, похоже, что в PHP дополнительные символы в более длинной строке будут отброшены, а в Perl они будут включены.

Update:

Чтобы получить желаемое поведение в PHP, есть несколько вариантов. Вы можете добавить нулевые символы в конец строки.

$password = '  '; 
$newchal = "abcdefghijklmnop"; 

#prints ABCDEFGH 
echo $password^$newchal; 

$password .= "\0\0\0\0\0\0\0\0"; 

#prints ABCDEFGHijklmnop 
echo $password^$newchal; 

В этом примере предполагается, что строки всегда являются фиксированной известной длиной. Если вам нужно обрабатывать произвольные случаи, вы можете измерить длину каждой строки, а затем добавить нулевые символы по мере необходимости. И, конечно, если вы не хотите изменять исходную переменную, поместите ее во временную переменную, прежде чем делать это.

+1

О, как я могу добавить нулевые биты к самому короткому значению в PHP для такого же поведения? – Buboon

+0

@Buboon, обновлено. –

0

Правильный ответ (если мы знаем, что пароль не больше $ newchal)

$iterations = ceil(mb_strlen($newchal)/mb_strlen($password)) - 1; 
    while($iterations > 0){ 
     $password .= ($password^$password); 
    $iterations--; 
    } 
$code = $password^$newchal; 
Смежные вопросы