Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Обход ограничений РНР

13
14 февраля 2007 года
RussianSpy
3.0K / / 04.07.2006
Эта тема не вопрос. Я просто хочу поделится кое-каким опытом.
Итак - в данный момент пишу подключение через сокеты к удаленному игровому серверу. С сокетами проблем не было, приступил к реализации шифрования. Выдали мне несколько файлов с С++ кодом - и вперед переписывать на РНР. Переписал - не работает. Тестовую строку не расшифровывает. Проверил разок - не работает. Проверил построчно (мало ли пропустил что-то) - не работает. 4 часа времени, 100 тыс нервных клеток - и решение найдено.
Вот кусок сишного кода:
 
Код:
unLo ^= sbox1[(int)(unHi >> 24)];

Переменная unHi имеет тип данных unsigned int (целое беззнаковое, 32 бита). Хитрость состоит в том, что в РНР нет такого типа данных. Все целые числа имеют тип int (целое со знаком, 32 бита). Соответственно операция побитового сдвига (unHi >> 24) в С++ возвращала результат (допустим) 0х0000008С, а в РНР такая же операция возвращала 0хFFFFFF8C.

Лечится достаточно просто (хотя в моем случае пришлось перелопатить немало кода) - вместо
 
Код:
$unLo ^= $sbox1[(int)($unHi >> 24)];

надо писать
 
Код:
$unLo ^= $sbox1[(int)(($unHi >> 24) & 0xFF)];


И все становится правильно. Может кому пригодится.:)

PS Кстати яркий пример того, что в порой требуется иметь возможность жестко указать тип данных. Будем надеятся что в РНР 6 помимо namespace и перегрузки функций и операторов появится такая возможность.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог