Показать полную графическую версию : Массовое редактирование бинарных фаилов
maxd2007
25-11-2013, 15:47
Имеется около 50 ти фаилов, во всех по одному и тому же адресу нужно нужно исправить предположим 1C на 1E т.е. по адресу 0x00000820 1C на 1E.
По подсказке пользователя "Iska" (копать FileOpen(), FileSetPos(), FileWrite(), FileClose()) почитал в справке (встроенной AutoIT) и разобрался, вроде, только со строкой FileOpen, т.е. FileOpen("1.img", 16) , далее я так понимаю что должно быть далее должно быть что то типа FileSetPos ("1.img", 0x00000820, ***); ***- это я не совсем понял, но предполагаю что тут должно быть значение на которое я хочу заменить? и тогда FileWrite мне не нужно (этой командой я смог только добавить в конец фаила свои значения, а не там где мне это нужно =( ).
Извиняюсь если непонятно выразился, недавно узнал про AutoIT, а MS-dos знаю не супер отлично, но хочу поправить положение дел. Если кто сможет помочь буду благодарен.
***- это я не совсем понял, но предполагаю что тут должно быть значение на которое я хочу заменить? »
Там должно быть «0».
Функция FileSetPos (http://autoit-script.ru/autoit3_docs/functions/FileSetPos.htm)
Функция FileWrite (http://autoit-script.ru/autoit3_docs/functions/FileWrite.htm)
madmasles
25-11-2013, 18:49
maxd2007,
Попробуйте примерно так.Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $hFile, $tData, $sFile = @ScriptDir (http://autoit-script.ru/autoit3_docs/macros.htm#@scriptdir) & '\test.bin'
;Создаем бинарный файл
$tData = DllStructCreate (http://autoit-script.ru/autoit3_docs/functions/DllStructCreate.htm)('byte[256]')
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 0 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) 255
DllStructSetData (http://autoit-script.ru/autoit3_docs/functions/DllStructSetData.htm)($tData, 1, $i, $i + 1)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
$hFile = FileOpen (http://autoit-script.ru/autoit3_docs/functions/FileOpen.htm)($sFile, 18)
FileWrite (http://autoit-script.ru/autoit3_docs/functions/FileWrite.htm)($hFile, DllStructGetData (http://autoit-script.ru/autoit3_docs/functions/DllStructGetData.htm)($tData, 1))
FileClose (http://autoit-script.ru/autoit3_docs/functions/FileClose.htm)($hFile)
$tData = 0
FileCopy (http://autoit-script.ru/autoit3_docs/functions/FileCopy.htm)($sFile, $sFile & '.old', 1)
;Меняем со смещением от начала 223 (0x000000DF) значение на -madmasles-
$hFile = FileOpen (http://autoit-script.ru/autoit3_docs/functions/FileOpen.htm)($sFile, 1)
FileSetPos (http://autoit-script.ru/autoit3_docs/functions/FileSetPos.htm)($hFile, 0x000000DF, 0)
FileWrite (http://autoit-script.ru/autoit3_docs/functions/FileWrite.htm)($hFile, Chr (http://autoit-script.ru/autoit3_docs/functions/Chr.htm)(0x2D) & Chr (http://autoit-script.ru/autoit3_docs/functions/Chr.htm)(0x6D) & Chr (http://autoit-script.ru/autoit3_docs/functions/Chr.htm)(0x61) & Chr (http://autoit-script.ru/autoit3_docs/functions/Chr.htm)(0x64) & Chr (http://autoit-script.ru/autoit3_docs/functions/Chr.htm)(0x6D) & Chr (http://autoit-script.ru/autoit3_docs/functions/Chr.htm)(0x61) & Chr (http://autoit-script.ru/autoit3_docs/functions/Chr.htm)(0x73) & Chr (http://autoit-script.ru/autoit3_docs/functions/Chr.htm)(0x6C) & Chr (http://autoit-script.ru/autoit3_docs/functions/Chr.htm)(0x65) & Chr (http://autoit-script.ru/autoit3_docs/functions/Chr.htm)(0x73) & Chr (http://autoit-script.ru/autoit3_docs/functions/Chr.htm)(0x2D))
FileClose (http://autoit-script.ru/autoit3_docs/functions/FileClose.htm)($hFile)
ConsoleWrite (http://autoit-script.ru/autoit3_docs/functions/ConsoleWrite.htm)(FileGetSize (http://autoit-script.ru/autoit3_docs/functions/FileGetSize.htm)($sFile) & @TAB (http://autoit-script.ru/autoit3_docs/macros.htm#@tab) & StringMid (http://autoit-script.ru/autoit3_docs/functions/StringMid.htm)(FileRead (http://autoit-script.ru/autoit3_docs/functions/FileRead.htm)($sFile & '.old'), 223, 13) & @LF (http://autoit-script.ru/autoit3_docs/macros.htm#@lf))
ConsoleWrite (http://autoit-script.ru/autoit3_docs/functions/ConsoleWrite.htm)(FileGetSize (http://autoit-script.ru/autoit3_docs/functions/FileGetSize.htm)($sFile) & @TAB (http://autoit-script.ru/autoit3_docs/macros.htm#@tab) & StringMid (http://autoit-script.ru/autoit3_docs/functions/StringMid.htm)(FileRead (http://autoit-script.ru/autoit3_docs/functions/FileRead.htm)($sFile), 223, 13) & @LF (http://autoit-script.ru/autoit3_docs/macros.htm#@lf))И смотрите в хекс-редакторе, что получили.
madmasles, Вы его этим «;Create bin file» скорее запутаете ;).
madmasles
25-11-2013, 21:36
Iska, поправил. :)
maxd2007
26-11-2013, 17:42
Ваш скрипт работает ))), но можно я задам Вам вопросы:
1) $sFile - что это такое? когда я читал документацию то там было написано что это хендл фаилы, но судя по Вашему скрипту похоже что Вы используете его как переменную и вот эта строчка $hFile = FileOpen($sFile, 18) задает ее параметр, так что же такое $hFile? Почему цифра 18? (в документации указана: "16 = Force binary mode (See Remarks)" ).
2) Local $hFile, $tData, $sFile = @ScriptDir & '\test.bin' - эта строчка от части понятна что она создает фаил test.bin в директории рядом со скриптом, но что означаетl $hFile, $tData, $sFile?
3) Я не понял окончания:
ConsoleWrite(FileGetSize($sFile) & @TAB & StringMid(FileRead($sFile & '.old'), 223, 13) & @LF)
ConsoleWrite(FileGetSize($sFile) & @TAB & StringMid(FileRead($sFile), 223, 13) & @LF)
Я понимаю что напрягаю нубскими вопросами, но если будет время и возможность буду признателен за пояснения.
1) $sFile - что это такое? »
Переменная типа Variant (String), представляет собой путь к файлу.
когда я читал документацию то там было написано что это хендл фаилы, »
Не было написано. Вы путаете.
и вот эта строчка $hFile = FileOpen($sFile, 18) задает ее параметр, так что же такое $hFile? »
А вот $hFile — это уже переменная типа Variant (Handle). Фактически — ссылка на открытый файл.
Почему цифра 18? (в документации указана: "16 = Force binary mode (See Remarks)" ). »
Точнее:
2 = Write mode (erase previous contents)
…
16 = Force binary mode (See Remarks).
18 = 2 + 16.
Local $hFile, $tData, $sFile = @ScriptDir & '\test.bin' - эта строчка от части понятна что она создает фаил test.bin в директории рядом со скриптом, »
Не создаёт файл. Только описывает три локальные переменные и задаёт последней из них строковое значение, представляющее собой путь к файлу.
3) Я не понял окончания:
ConsoleWrite(FileGetSize($sFile) & @TAB & StringMid(FileRead($sFile & '.old'), 223, 13) & @LF)
ConsoleWrite(FileGetSize($sFile) & @TAB & StringMid(FileRead($sFile), 223, 13) & @LF) »
Что именно не поняли здесь?
maxd2007
27-11-2013, 17:31
Еще раз спасибо, можно уточнить некоторые моменты:
1) Local $hFile, $tData, $sFile = @ScriptDir & '\test.bin' т.е. это получается что если в скрипте где то указано $hFile или $tData или $sFile то это будет значить обращение в фаилу test.bin в директории рядом со скриптом?
2) В этой строчке:
ConsoleWrite(FileGetSize($sFile) & @TAB & StringMid(FileRead($sFile & '.old'), 223, 13) & @LF)
ConsoleWrite(FileGetSize($sFile) & @TAB & StringMid(FileRead($sFile), 223, 13) & @LF)
я не понял зачем она и что она делает, ведь работа с фаилом заканчивается здесь:
$hFile = FileOpen($sFile, 1)
FileSetPos($hFile, 0x000000DF, 0)
FileWrite($hFile, Chr(0x2D) & Chr(0x6D) & Chr(0x61) & Chr(0x64) & Chr(0x6D) & Chr(0x61) & Chr(0x73) & Chr(0x6C) & Chr(0x65) & Chr(0x73) & Chr(0x2D))
FileClose($hFile)
1) Local $hFile, $tData, $sFile = @ScriptDir & '\test.bin' т.е. это получается что если в скрипте где то указано $hFile или $tData или $sFile то это будет значить обращение в фаилу test.bin в директории рядом со скриптом? »
Только «$sFile». Переменные «$hFile» и «$tData» этой строкой только описываются, но значения им не присваиваются.
Эту строку можно было бы записать и так:
Local $hFile
Local $tData
Local $sFile
$sFile = @ScriptDir & '\test.bin'
Инструкция Local описывает, объявляет переменные. Какое значение конкретная переменная примет — определяется только в момент присвоения ей конкретного значения, будь то одновременно с её объявлением:
Local $hFile, $tData, $sFile = @ScriptDir & '\test.bin'
либо позже по тексту скрипта, как во втором примере:
Local $hFile
Local $tData
Local $sFile
$sFile = @ScriptDir & '\test.bin'
2) В этой строчке:
ConsoleWrite(FileGetSize($sFile) & @TAB & StringMid(FileRead($sFile & '.old'), 223, 13) & @LF)
ConsoleWrite(FileGetSize($sFile) & @TAB & StringMid(FileRead($sFile), 223, 13) & @LF)
я не понял зачем она и что она делает, »
Выводит на консоль (можно увидеть в редакторе SciTE или перенаправив поток stdout скрипта в файл) размер файла, указанного переменной $sFile, и значения 13 символов, начиная с 223 символа, из старого и нового файлов соответственно. Как правило — сугубо в отладочных целях.
maxd2007, вы приводите тексты описаний из англ. справки. Если вы новичок, хочу чтобы не прошло мимо наличие русской справки (http://forum.oszone.net/post-2232748.html#post2232748)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.