Что нового

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

ynbIpb

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
Эти 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
 
Автор
Y

ynbIpb

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

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

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
ynbIpb сказал(а):
Файлы по 1 мб, по этому процесс довольно длителен. От чего можно отталкиваться чтоб выставлять значения в прогрессбаре?
Код:
$iPercent = Round($i / $iSize * 100)
 
Верх