Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   Массовое редактирование бинарных фаилов (http://forum.oszone.net/showthread.php?t=272758)

maxd2007 25-11-2013 15:47 2261372

Массовое редактирование бинарных фаилов
 
Имеется около 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 знаю не супер отлично, но хочу поправить положение дел. Если кто сможет помочь буду благодарен.

Iska 25-11-2013 18:34 2261468

Цитата:

Цитата maxd2007
***- это я не совсем понял, но предполагаю что тут должно быть значение на которое я хочу заменить? »

Там должно быть «0».

Функция FileSetPos
Функция FileWrite

madmasles 25-11-2013 18:49 2261477

maxd2007,
Попробуйте примерно так.
Код:

Local $hFile, $tData, $sFile = @ScriptDir & '\test.bin'

;Создаем бинарный файл
$tData = DllStructCreate('byte[256]')
For $i = 0 To 255
    DllStructSetData($tData, 1, $i, $i + 1)
Next
$hFile = FileOpen($sFile, 18)
FileWrite($hFile, DllStructGetData($tData, 1))
FileClose($hFile)
$tData = 0
FileCopy($sFile, $sFile & '.old', 1)

;Меняем со смещением от начала 223 (0x000000DF) значение на -madmasles-
$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)

ConsoleWrite(FileGetSize($sFile) & @TAB & StringMid(FileRead($sFile & '.old'), 223, 13) & @LF)
ConsoleWrite(FileGetSize($sFile) & @TAB & StringMid(FileRead($sFile), 223, 13) & @LF)

И смотрите в хекс-редакторе, что получили.

Iska 25-11-2013 19:37 2261501

madmasles, Вы его этим «;Create bin file» скорее запутаете ;).

madmasles 25-11-2013 21:36 2261569

Iska, поправил. :)

maxd2007 26-11-2013 17:42 2261945

Ваш скрипт работает ))), но можно я задам Вам вопросы:
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)
Я понимаю что напрягаю нубскими вопросами, но если будет время и возможность буду признателен за пояснения.

Iska 26-11-2013 21:40 2262061

Цитата:

Цитата maxd2007
1) $sFile - что это такое? »

Переменная типа Variant (String), представляет собой путь к файлу.

Цитата:

Цитата maxd2007
когда я читал документацию то там было написано что это хендл фаилы, »

Не было написано. Вы путаете.

Цитата:

Цитата maxd2007
и вот эта строчка $hFile = FileOpen($sFile, 18) задает ее параметр, так что же такое $hFile? »

А вот $hFile — это уже переменная типа Variant (Handle). Фактически — ссылка на открытый файл.

Цитата:

Цитата maxd2007
Почему цифра 18? (в документации указана: "16 = Force binary mode (See Remarks)" ). »

Точнее:
Цитата:

2 = Write mode (erase previous contents)

16 = Force binary mode (See Remarks).
18 = 2 + 16.

Цитата:

Цитата maxd2007
Local $hFile, $tData, $sFile = @ScriptDir & '\test.bin' - эта строчка от части понятна что она создает фаил test.bin в директории рядом со скриптом, »

Не создаёт файл. Только описывает три локальные переменные и задаёт последней из них строковое значение, представляющее собой путь к файлу.

Цитата:

Цитата maxd2007
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 2262577

Еще раз спасибо, можно уточнить некоторые моменты:
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)

Iska 27-11-2013 18:16 2262619

Цитата:

Цитата maxd2007
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'

Цитата:

Цитата maxd2007
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 символа, из старого и нового файлов соответственно. Как правило — сугубо в отладочных целях.

AZJIO 28-11-2013 19:02 2263256

maxd2007, вы приводите тексты описаний из англ. справки. Если вы новичок, хочу чтобы не прошло мимо наличие русской справки


Время: 10:18.

Время: 10:18.
© OSzone.net 2001-