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


Автор: RinOSpro 24.12.2007, 19:20
Здравствуйте мне нужно было код с с++ перевести на php 
Код

for (i = 1; i < len; i++)
    key[i] = lock[i] xor lock[i-1];
The first key character is calculated from the first lock character and the last two lock characters:


key[0] = lock[0] xor lock[len-1] xor lock[len-2] xor 5
Next, every character in the key must be nibble-swapped:


for (i = 0; i < len; i++)
    key[i] = ((key[i]<<4) & 240) | ((key[i]>>4) & 15)



вот так перевел
Код

$keyy = "";
settype($keyy,"string");

for ($i = 1; $i < strlen($lock); $i++)
$keyy[$i] = $lock[$i] xor $lock[$i-1];

$keyy[0] = $lock[0] xor $lock[strlen($lock)-1] xor $lock[strlen($lock)-2] xor 5;

for ($i = 0; $i < strlen($lock); $i++)
$keyy[$i] = (($keyy[$i]<<4) & 240) | (($keyy[$i]>>4) & 15);

echo $keyy;

}



Но $keyy имеет тип Array хотя я и settype использовал!

Помагите пожалуйста!

Автор: Levsha 24.12.2007, 19:44
Как вариант можно в конце массив перевести в строку
Код
$keyy = implode ("", $keyy);

Автор: skyboy 24.12.2007, 21:10
дело в другом.
точнее, немного в другом.
просто у тебя $keyy - пустая строка. потому попытка "достучаться" через индекс до 5, 7 и 29 символов ничего не устанавливает. тип меняется на массив и вставляются значения как элементы с указанным индексом. потому либо вариант, предложенный Levsha, либо в начале
Код

$keyy= str_pad($keyy,strlen($lock));


Добавлено через 3 минуты и 26 секунд
Цитата(skyboy @  24.12.2007,  20:10 Найти цитируемый пост)
дело в другом.

в смысле - проблема не в "неверном определении РНР типа", а в неверном подходе.
когда ты работаешь в С/С++, то запись $keyy[55] означает запись в ячейку памяти по адресу $keyy + sizeof($keyy[0]). И потом, когда говоришь "выводи от адреса $keyy до символа \0 как строку" С/С++ выводит.
А в случае с РНР работы с памятью напрямую не происходит. Интепретатор, видя, что ты пытаешься получить от пустого значения элемента по индексу попросту меняет тип(сказывается динамическая типизация), так, чтоб твои действия(взятие несуществующего индекса) имело хоть какой-то смысл. вот и все.

Автор: Levsha 25.12.2007, 07:01
skyboy, согласен что дело в другом. просто предложил действенный способ если не надо париться smile 
Ну а если запариться
Код

$keyy = " "; //RinOSpro, заметь, что переменная не пустая, в ней пробел!!!!
$lock = "11232342341";//взял произвольную последовательность чисел

for ($i = 1; $i < strlen($lock); $i++) $keyy .= $lock[$i] xor $lock[$i-1];
//вот тут вся соль. Когда строка еще не сформирована, новое значение мы к ней прибавляем с помощью ".=" . 
//Как к массиву через "[]" к ней еще нельзя обращаться

echo $keyy."\n";//поглядим

$keyy[0] = $lock[0] xor $lock[strlen($lock)-1] xor $lock[strlen($lock)-2] xor 5;

echo $keyy."\n";//поглядим еще раз

for ($i=0; $i< strlen($lock); $i++) $keyy[$i] = (($keyy[$i]<<4) & 240) | (($keyy[$i]>>4) & 15);
//теперь, когда строка нужной длины у нас сформирована, к ней можно обращаться через [$i]

echo $keyy."\n";//поглядим результат


Автор: RinOSpro 25.12.2007, 20:47
Спасибо! сейчас тип правильно определяется. но результат какой то не такой. 

К примеру $lock = EXTENDEDPROTOCOL]pLLi6vTpnvU67>vqPf:MH]X4BCwin;
Тогда $keyy = 00000000000000000000660000001000008000001000000000000000000000000066000000100000800000100000

что то не верно

Автор: Levsha 26.12.2007, 09:25
А какой должен быть $keyy
Что в С++ означает "xor" ?

Точно не скажу, но насколько я помню, когда я работал с этим оператором в php , он работал только с числами... И еще помлю что он давал разные результаты на разных платформах, при одинаковых условиях. Короче он мутный какой-то!  smile 

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