Поиск шестнадцатеричной строки в файле в php? - PullRequest
1 голос
/ 20 января 2012

В настоящее время я использую следующие два метода в своем классе, чтобы выполнить работу:

function xseek($h,$pos){
    rewind($h);
    if($pos>0)
    fread($h,$pos);
}
function find($str){
    return $this->startingindex($this->name,$str);
}

function startingindex($a,$b){
    $lim = 1 + filesize($a) - strlen($b)/2;
    $h = fopen($a,"rb");
    rewind($h);
    for($i=0;$i<$lim;$i++){
        $this->xseek($h,$i);
        if($b==strtoupper(bin2hex(fread($h,strlen($b)/2)))){
            fclose($h);
            return $i;
        }
    }
    fclose($h);
    return -1;
}

Я понимаю, что это довольно неэффективно, особенно для PHP, но мне не разрешают использовать другие языки в моем плане хостинга.

Я выполнил пару тестов, и когда шестнадцатеричная строка находится в начале файла, она запускается быстро и возвращает смещение. Однако, если шестнадцатеричная строка не найдена, страница на некоторое время зависает. Это убивает меня изнутри, потому что в прошлый раз, когда я тестировал PHP и имел зависшие страницы, мой веб-хост закрыл мой сайт на 24 часа из-за слишком большого количества процессорного времени.

Есть ли лучший способ сделать это (найти смещение шестнадцатеричной строки в файле)? Есть ли определенные аспекты, которые можно улучшить, чтобы ускорить выполнение?

Я прочитал бы все содержимое файла в одну шестнадцатеричную строку и использовал бы strrpos, но я получал ошибки о превышении максимального объема памяти. Будет ли это лучшим способом, если я порежу файл и поищу большие куски с помощью strrpos?

редактирование:

Чтобы указать, я имею дело с файлом настроек для игры. Настройки и их значения находятся в блоке, где перед настройкой стоит 32-разрядное целое число, затем значение, 32-разрядное целое число перед значением и затем значение. Оба целых числа представляют длины следующих строк. Например, если значение параметра «test», а значение «0», оно будет выглядеть (в шестнадцатеричном формате): 00000004746573740000000130. Теперь, когда вы упомянули это, это кажется плохим способом. Чтобы вы посоветовали?

изменить 2:

Я попробовал файл, размер которого был ниже максимально допустимого, и попробовал strrpos, но он был намного медленнее, чем тот, который я пробовал.

изменить 3: в ответ Чарльзу:

Что неизвестно, так это длина блока настроек и где он начинается. То, что я действительно знаю, это то, что первые и последние настройки обычно. Я использовал эти методы поиска, чтобы найти местоположение первой и последней настройки и определить длину блока настроек. Я также знаю, где начинается родительский блок. Блок настроек обычно содержит не более 50 байтов в родительском блоке, поэтому я мог бы начать поиск первой настройки и ограничить область поиска. Проблема в том, что мне также нужно найти последние настройки. Длина блока настроек является переменной и может быть любой длины. Я мог прочитать файл так, как я предполагаю, что игра делает, читая размер настройки, читая настройку, читая размер значения, читая значение и т. Д., Пока я не достиг байта со значением -1, или FF в шестнадцатеричном виде Будет ли сочетание ограничения поиска первой настройки и правильного чтения настроек сделать это намного более эффективным?

1 Ответ

2 голосов
/ 20 января 2012

У вас много мусорного кода.Например, этот код почти ничего не делает:

function xseek($h,$pos){
    rewind($h);
    if($pos>0)
    fread($h,$pos);
}

, потому что он читает каждый раз с начала файла.Кроме того, зачем вам что-то читать, если вы не возвращаете это?Может быть, вы ищите для fseek()?

Если вам нужно найти шестнадцатеричную строку в двоичном файле, может быть лучше использовать что-то вроде этого: http://pastebin.com/fpDBdsvV (скажитемне, если есть какие-то ошибки / проблемы).

Но, если вы анализируете файл настроек игры, я бы посоветовал вам использовать fseek(), fread() и unpack() для поиска места установки, чтения части байтов и распаковки в типы переменных PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...