Ветеран
Сообщения: 2371
Благодарности: 562
|
Профиль
|
Отправить 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
|