Что нового

Сравнение двух бинарных файлов

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Есть 2 файла, первый файл меньше второго файла на 16 байт.
эти 16 байт могут находиться в теле второго файла в любом месте и иметь любое значение, так что поиском их не найти. В остальном файлы идентичны.
Необходимо выяснить методом сравнения что это за байты.
Как бы это реализовать на автоит?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Эти 16 байт идут последовательно или разбросаны в разных местах в файле? Если подряд то можно примерно так:

Код:
#Include <WinAPI.au3>

Global Const $sFile1 = 'MyFile1.bin' ; This file is longer at 16 bytes
Global Const $sFile2 = 'MyFile2.bin'

Global $hFile1, $hFile2, $tData1, $tData2, $iSize1, $iSize2, $iBytes, $iPos

$iSize1 = FileGetSize($sFile1)
$hFile1 = _WinAPI_CreateFile($sFile1, 2, 2)
$tData1 = DllStructCreate('byte[' & $iSize1 & ']')
_WinAPI_ReadFile($hFile1, DllStructGetPtr($tData1), $iSize1, $iBytes)
_WinAPI_CloseHandle($hFile1)

$iSize2 = FileGetSize($sFile2)
$hFile2 = _WinAPI_CreateFile($sFile2, 2, 2)
$tData2 = DllStructCreate('byte[' & $iSize2 & ']')
_WinAPI_ReadFile($hFile2, DllStructGetPtr($tData2), $iSize2, $iBytes)
_WinAPI_CloseHandle($hFile2)

$iPos = 0
For $i = 1 To $iSize2
    If DllStructGetData($tData1, 1, $i) <> DllStructGetData($tData2, 1, $i) Then
        $iPos = $i
        ExitLoop
    EndIf
Next
If $iPos = 0 Then
    $iPos = $iSize2 + 1
EndIf
For $i = $iPos To $iPos + 15
    ConsoleWrite('0x' & Hex(DllStructGetData($tData1, 1, $i), 2) & @CR)
Next
 
Автор
ynbIpb

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Yashied, изумительно!
да байты идут подрят.
Ничего не понял в коде, но работает... ;D
До Winapi и DLL мне далеко.
Огромное спасибо.

Я уже начал мутить по другому: читать файл в бинарном режиме, подсчёт символов в строке, разделить на 2, получаем число байтов
и потом по 1 байду заносить в массив.
и сравнивать в цикле 2 массива, как появится неравность - вот оно начало этих 16ти байтов.

з.ы.
Файлы по 1 мб, по этому процесс довольно длителен. От чего можно отталкиваться чтоб выставлять значения в прогрессбаре?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
ynbIpb сказал(а):
Файлы по 1 мб, по этому процесс довольно длителен. От чего можно отталкиваться чтоб выставлять значения в прогрессбаре?

Код:
$iPercent = Round($i / $iSize * 100)
 
Верх