2016-04-07 3 views
1

Я пытаюсь создать encrypter на своем веб-сайте с помощью PHP. Я создал то же самое перед использованием Lua, поэтому в настоящее время я пытаюсь его перенести, однако это ошибка, заявляющая, что я исчерпал слишком много памяти, но я не уверен, что могло бы вызвать это:Выделенная ошибка памяти в рекурсивной функции

function offsetASCII($OrigByte, $Offset) { 
    $OrigByte = $OrigByte + $Offset; 
    if ($OrigByte > $MaxASCII) { 
     return offsetASCII($MinASCII, $OrigByte-$MaxASCII); 
    } else { 
     return $OrigByte; 
    } 
} 

Идея состоит в том, что она поддерживает смещение номера OrigByte на число Offset. Если новое значение для OrigByte больше максимально допустимого значения, то оно повторяет функцию, которая делает OrigByte минимальным допустимым значением, и делает смещение «оставшейся» суммы, на которую оно превысило максимальное значение. Это повторяется до тех пор, пока оно не будет в пределах максимального значения, а затем оно вернет его.

Ошибка:

Fatal error: Allowed memory size of 94371840 bytes exhausted (tried to allocate 130968 bytes) in [PageDirectoryHere] on line 49

Линия 49:

return offsetASCII($MinASCII, $OrigByte-$MaxASCII); 

OrigByte может быть любой буквой превращали в его ASCII-значение. MinASCII и MaxASCII являются минимальными и максимальными значениями заглавных букв в ASCII (65 и 90). Смещение первоначально является rand ($ MinASCII, $ MinASCII + 25).

Я не знаю, почему это происходит, поэтому заблаговременно за помощь!

+0

Увеличение предела памяти в php.ini –

+0

Почему вы пытаетесь создать шифр? Для чего это? Потому что вы никогда не должны откатывать свой собственный крипто. – st2erw2od

+1

Поскольку мы не знаем никакой информации о фактических данных, которые вы используете, лучший ответ, который мы можем вам дать, «потому что PHP исчерпал всю доступную память». – h2ooooooo

ответ

1

Решение:

function offsetASCII($OrigByte, $Offset, $MinASCII, $MaxASCII) { 
    $OrigByte = $OrigByte + $Offset; 
    if ($OrigByte > $MaxASCII) { 
     return offsetASCII($MinASCII, $OrigByte-$MaxASCII, $MinASCII, $MaxASCII); 
    } else { 
     return $OrigByte; 
    } 
} 

$EncryptedChar = chr(offsetASCII($NowByte, $NewKeyNums[$Iter], 65, 90)); 

Первое, что я делаю неправильно пытался использовать $ MinASCII и $ MaxASCII вне области видимости функции (я решил, добавив их в качестве параметров).

Вторая вещь, которую я делал неправильно, заключалась в определении $ MinASCII и $ MaxASCII за пределами области действия, где я вызывал функцию (я решил, введя числа, которые они представляли, а не устанавливал для них переменные).

Смежные вопросы