Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно
MKN MKN вне форума

Ветеран


Сообщения: 2358
Благодарности: 559

Профиль | Отправить PM | Цитировать


Цитата K.A.V.:
в переменную имени файла сбрасывается значение "." и ".." »
точно так, прозевал этот момент... А с чего вдруг образуются эти странные значения ?
Цитата K.A.V.:
одной разве не достаточно? »
Начинал с одной, но почему то получается ахинея с нумерацией, если файлов много и имена начинаются с цифр...

ps Возвращаясь к поиску HEX значений в файлах, для которых "класический" код работает , как черепаха, т.е. не годен для практики.
Оказывается есть иной приём поиска. HEX-последовательность ищется сначала в первых 300 кб, потом в следующих и т.д.
Поэтому поиск выполняется очень быстро. Есть и готовая реализация, но на AutoIt3. Было бы интересно переконвертировтаь этот код в NSIS...
читать дальше »
Код: Выделить весь код
#cs HEX-последовательность ищется сначала в первых 300 кб, потом в следующих и т.д.
Поэтому поиск выполняется очень быстро.
#ce

Opt('MustDeclareVars', 1)

;~ поменяйте $sFile и $sHex на свои
Global $sFile = 'C:\ProgramNoAdmin\AutoIt3_381\AutoIt3.exe', $sHex = 'C4 04 84 C0 74 0B 84 DB 75 2D 32 C0 5B 8B E5', _
        $iOffSet, $hFile, $sRead

$iOffSet = _Find_HexString_In_File($sFile, $sHex)
If @error Then Exit ConsoleWrite('Error: ' & @error & @LF)
If Not $iOffSet Then Exit ConsoleWrite('Not hex string' & @LF)

ConsoleWrite('Offset = ' & $iOffSet & ' (hex offset = 0x' & Hex($iOffSet, 8) & ')' & @LF)
;~ проверяем полученный результат:
$hFile = FileOpen($sFile, 16)
FileSetPos($hFile, $iOffSet, 0);$FILE_BEGIN = 0
$sRead = Hex(FileRead($hFile, StringLen(StringStripWS($sHex, 8)) / 2))
FileClose($hFile)
ConsoleWrite($sRead & @TAB & ($sRead = StringStripWS($sHex, 8)) & @LF)

#cs
    Вернет при успехе позицию вхождения $s_HexString в файле $s_File или 0, если нет вхождения.
    При неудаче вернет 0 и флаг @error = :
    1   - нет файла $s_File;
    2   - длина $s_HexString не кратна 2;
    3   - не получилось открыть файл $s_File;
    4   - ошибка функции FileSetPos.

    Читает весь файл подряд по 300 Кб, можно поменять на нужные Вам
#ce
Func _Find_HexString_In_File($s_File, $s_HexString)
    Local Const $i_Read = 300 * 1024, $__FILE_CURRENT_ = 1
    Local $i_Len, $h_File, $b_Read, $i_Pos, $i_Count, $i_Err

    If Not FileExists($s_File) Then Return SetError(1, 0, 0)
    If IsBinary($s_HexString) Then
        $s_HexString = Hex($s_HexString)
    Else
        $s_HexString = StringStripWS($s_HexString, 8)
    EndIf
    $i_Len = StringLen($s_HexString)
    If Mod($i_Len, 2) Then Return SetError(2, 0, 0)
    $i_Len /= 2
    $h_File = FileOpen($s_File, 16)
    If $h_File = -1 Then Return SetError(3, 0, 0)
    While 1
        $b_Read = FileRead($h_File, $i_Read)
        If @extended <= $i_Len Then ExitLoop
        $i_Pos = StringInStr($b_Read, $s_HexString, 2)
        If Mod($i_Pos, 2) Then ExitLoop
        $i_Pos = 0
        If Not FileSetPos($h_File, -$i_Len, $__FILE_CURRENT_) Then
            $i_Err = 4
            ExitLoop
        EndIf
        $i_Count += 1
    WEnd
    FileClose($h_File)
    If $i_Err Then Return SetError($i_Err, 0, 0)
    If $i_Pos Then Return Int(($i_Pos - 1) / 2 - 1 + ($i_Read - $i_Len) * $i_Count)
    Return 0
EndFunc   ;==>_Find_HexString_In_File

Последний раз редактировалось MKN, 02-04-2015 в 10:48.


Отправлено: 10:04, 02-04-2015 | #1553