Показать полную графическую версию : автоматический поиск и замена HEX в файлах
Возможно ли такое сделать с помощью cmd? Нужно автоматически поправить HEX большого количества файлов с последующим переименованием.
И вот ещё: как сделать так чтобы такой скрипт работал:
1 - при перетаскивании на него одного/группы файлов
2 - при запуске производился поиск и обработка файлов вглубь по каталогам.
p.s.: иногда нужно не заменить hex, а добавить его в определённое место в файле.
автоматически поправить HEX большого количества файлов с последующим переименованием »
если по адресу, то проще Unix-утилитой DD (http://ru.wikipedia.org/wiki/Dd) (порт (http://www.chrysocome.net/dd) для Windows), если по значению - посимвольным конвертером TR (http://ru.wikipedia.org/wiki/Tr) (есть в комплекте GNU utilities for Win32 (http://unxutils.sourceforge.net/)) или любым CMD-редактором, поддерживающим HEX (SFK (http://swissfileknife.sourceforge.net/), FART (http://fart-it.sourceforge.net/) и т.п.)
P.S. если размер файлов <= 65280 байт можно поизвращаться со штатной DEBUG.EXE
Вот пример, заголовок файла, нужно найти значения на верхней картинке и заменить их на значения на нижней картинке, очень часто требуются именно такие операции. Ещё иногда нужно добавить заголовок в файл. Хотелось бы обойтись без сторонних утилит, так сказать автоматизировать, потому что иногда количество файлов переваливает за несколько тысяч.
значения на верхней картинке и заменить их на значения на нижней картинке »конкретизируйте задачу именно для батника (картинки он распознавать не умеет): ОТКУДА взять блок (файл/позиция/длина/значение), КУДА этот блок записать/вставить (файл/позиция/длина/значение), как планируете передавать эти параметры в батник (переменная, командная строка, файл)?
Хотелось бы обойтись без сторонних утилит, так сказать автоматизировать, потому что иногда количество файлов переваливает за несколько тысяч. »проще и надежней автоматизировать как раз сторонними утилитами, про ограничения DEBUG.EXE уже сказал
Уточню, что я знаком как с cmd так и с hex довольно поверхностно, поэтому вот этого
ОТКУДА взять блок (файл/позиция/длина/значение), КУДА этот блок записать/вставить (файл/позиция/длина/значение), как планируете передавать эти параметры в батник (переменная, командная строка, файл)? »
я не смогу сделать, т.е. если вы объясните как мне это объяснить, то конечно смогу, но тут же не школа, зачем вам это нужно (я имею ввиду объяснять).
проще и надежней автоматизировать как раз сторонними утилитами, про ограничения DEBUG.EXE уже сказал »
про эту программу понял, так же обратил внимание на две консольные утилиты:
SFK, FART»
в принципе я этого и искал, FART предпочтительнее, так как он весит меньше SFK. но по FART не нашёл толком примеров, даже не знаю как к файлу его применить.
Так вот к вопросу
конкретизируйте задачу именно для батника (картинки он распознавать не умеет) »
Нужно чтобы выделенная часть файла на картинке сверху была найдена в файле и заменена на выделенную часть файла на нижней картинке. Картинка в моём предыдущем посте.
я знаком как с cmd так и с hex довольно поверхностно »да в общем, речь не про CMD/HEX... пример:
взять с файла TEST1.BIN первые 128 байт и скопировать в начало (с заменой) файла TEST2.BIN, вариант на DD:
dd bs=1c count=128 if="test1.bin" of="%~n0.tmp"
dd bs=1c count=128 if="%~n0.tmp" of="test2.bin"
или так:
dd bs=1c count=128 if="test1.bin" of="test2.bin"
это с помощью стандартного CMD?
а как заменить не начало (либо конец), а именно определённые значения? потому что бывает так, что есть файлы с разными значениями вначале, соответственно эти значения нужно заменить на другие, тоже разные.
и как сделать это с маской? или вот это:
1 - при перетаскивании на него одного/группы файлов
2 - при запуске производился поиск и обработка файлов вглубь по каталогам. »
это с помощью стандартного CMD? »
+ названная выше утилита DD
а как заменить не начало (либо конец), а именно определённые значения?""определенные" чем?.. если расположением блока в файле, то начало блока можно задать параметрами SKIP/SEEK уилиты DD (соответственно, для смещения блока байтов во входном/выходном файлах)... в конце концов, где-то это "значение" всё равно нужно брать
как сделать это с маской? »легко, только сначала нужно определиться с предыдущими пунктами
Да-да, теперь с программой понятно (я так понимаю она тоже консольная) чтобы например зашить её утилитой Quick Batch File Compiler.
именно блок (определённые значения) нужно заменить, прошу покажите на примере хотя бы моих файлов (http://www.mediafire.com/?2dv48lvpbdv7rqh)
чтобы например зашить её утилитой Quick Batch File Compiler »консольная, но сторонними компиляторами не балуюсь... как-то и без этого работает
прошу покажите на примере хотя бы моих файлов »
собственно, ничем не отличается от примера из поста #6 (кроме имен файлов), по вашему рисунку блок считается именно с начала файла... либо, укажите другое условие:
@echo off
set F0=mcc001n2b. SDD
set F1=DXT5_2048x2048.dds
dd bs=1c count=128 if="%F0%" of="%F1%"
Так, значит получается скрипт ищет блок в файле DXT5_2048x2048.dds и подставляет в то же место в файл mcc001n2b. SDD. Это работает!
Но при этом получается? что нужен файл DXT5_2048x2048.dds, который вечит 4 мб, хотя думаю можно удалить всё, что не нужно в HEX'e этого файла (думаю при этом будет весить не больше трёх килобайт).
А как осуществить поиск определённого блока и замену этого блока на новый по маске, допустим *. SDD?
Так, значит получается скрипт ищет блок в файле DXT5_2048x2048.dds и подставляет в то же место в файл mcc001n2b. SDD. Это работает! »он ничего не ищет - просто берет блок заданного размера (128 байт) из заданной позиции (=0) в заданном файле (mcc001n2b. SDD) и копирует его в заданную позицию (=0) другого файла (DXT5_2048x2048.dds)
Но при этом получается? что нужен файл DXT5_2048x2048.dds, который вечит 4 мб »размер самого файла не имеет значения
как осуществить поиск определённого блока »
что ищем-то?... прежде чем писать скрипт, нужно четко представлять алгоритм работы (без скрипта), а вот этого я никак не могу понять.... очевидно, двух файлов для примера маловато
Так, постараюсь объяснить исходя из того, что я от вас уже узнал.
Дано: 1000 файлов с расширением *. SDD
700 файлов с заданной позиции (=0) имеют блок заданного размера (128 байт) 1-ого типа (DXT5)
200 файлов с заданной позиции (=0) имеют блок заданного размера (128 байт) 2-ого типа (DXT1)
100 файлов с заданной позиции (=0) имеют блок заданного размера (128 байт) 3-ого типа (DXT1a)
типы равны по размеру блока, но отличаются содержанием этого блока
Задача:
1 - в каждом файле с расширением *. SDD заменить блок заданного размера (128 байт) на новый тип
2 - переименовать расширение *. SDD в *.dds
Tosyk, 700+200+100=1000, т.е. каждому SDD-файлу соответствует какой-то один блок из 3-х, допустим эти блоки находятся в файлах DXT5.BIN, DXT1.BIN, DXT1a.BIN, которые находятся в том же каталоге, где батник... осталось решить какой из этих трёх блоков выбрать для конкретного SDD-файла?... или это не имеет значения, т.е. по порядку - первые 700 -> DXT5.BIN, следующие 200 -> DXT1.BIN и т.д.?.. и какова примерно структура каталога с SDD-файлами?
Tosyk, 700+200+100=1000, т.е. каждому SDD-файлу соответствует какой-то один блок из 3-х, допустим эти блоки находятся в файлах DXT5.BIN, DXT1.BIN, DXT1a.BIN, которые находятся в том же каталоге, где батник... осталось решить какой из этих трёх блоков выбрать для конкретного SDD-файла?... или это не имеет значения, т.е. по порядку - первые 700 -> DXT5.BIN, следующие 200 -> DXT1.BIN и т.д.? »
Да, вы всё правильно поняли. Структура каталогов может быть различная.
осталось решить какой из этих трёх блоков выбрать для конкретного SDD-файла »
Расскажу немного о *. SDD файлах. Это текстуры использующие стандарт сжатия DXT, только с изменённым заголовком. Из-за изменённого заголовка они как раз и не открываются и не просматриваются. Поэтому нужно это заголовок заменить на правильный!
структура каталога с SDD-файлами »
в каталогах могут быть такие типы (о типах упоминал выше, для примера тогда назвал 3):
DXT1 256x256
DXT1 512x512
DXT1 1024x512
DXT1 1024x1024
DXT1 2048x2048
DXT1 2048x1024
DXT5 256x256
DXT5 512x512
DXT5 1024x512
DXT5 1024x1024
DXT5 2048x2048
DXT5 2048x1024
...
цифры (пр.: 256x256) - это размер текстуры в пикселях. Типов текстур может быть и больше. Каждому типу соответствует свой блок заданного размера (128 байт) и начинается он с заданной позиции (=0).
в каталогах могут быть такие типы (о типах упоминал выше, для примера тогда назвал 3)»
значит для каждого типа нужно будет "приготовить" свой файл-шаблон (размером 128 байт) с нужным содержимым и узнаваемым именем типа "DXT1_1024x1024.BIN", но один вопрос так и остался нерешенным: допустим, мы перебираем все SDD файлы в папке по очереди (в произвольном порядке), берем очередной SDD-файл, как определить, какой BIN-файл из "библиотеки шаблонов" ему соответствует?.. по имени SDD-файла?... размеру или еще как?.. полагаю, шаблон должен соответствовать размеру текстуры, но как установить это соответствие?.. как вы это определяете при ручной замене?
как вы это определяете при ручной замене? »
Я определяю только на глаз по размеру файла в мегабайтах. Примерно знаю сколько какой тип должен "весить" и подставляю ему "правильный" блок.
Вот я и говорил об этом в моём посте чуть выше
а как заменить не начало (либо конец), а именно определённые значения?»
Обратите внимание на картинку которую я прикреплял. Там в первом файле (верхний, тот, который нужно исправить):
SDD...|...@...5TXD...@...
нужно заменить на
DDS |...@...DXT5...
Так вот, можно ли искать конкретно эти самые значения? Допустим в определённых байтах ищем
SDD, затем ..@.., затем 5TXD, затем ...@...
и если сочетание всех этих значение найдено, то приравниваем этот файл к типу DXT5 2048x1024 (в данном случае) и заменяем его первые 128 байт на новые.
Так вот, можно ли искать конкретно эти самые значения? Допустим в определённых байтах ищем »если все "неправильные" (старые) заголовки можно отфиксировать в файлах аналогично правильным (новым), типа: "DXT1_1024x1024.OLD"/"DXT1_1024x1024.NEW", то для каждого обрабатываемого SDD алгоритм может быть следующий:
- считываем заголовок во временный файл;
- ищем точно такой же файл в библиотеке "неверных шаблонов";
- если файл найден, берем новый шаблон с таким же именем;
- восстанавливаем новый заголовок
только надо определиться с положением/размером блока, однозначно идентифицирующего тип "неверного" шаблона и "построить" библиотеку пар шаблонов старый/новый
Я определяю только на глаз по размеру файла в мегабайтах. Примерно знаю сколько какой тип должен "весить" и подставляю ему "правильный" блок. »если определить интервалы размеров для каждого типа, то можно и по размеру
- считываем заголовок во временный файл;
- ищем точно такой же файл в библиотеке "неверных шаблонов";
- если файл найден, берем новый шаблон с таким же именем;
- восстанавливаем новый заголовок »
Всё вроде так и есть. Подскажите пример как это сделать кодом. В общем я себе это представляю, а вот что конкретно писать не знаю.
Подскажите пример как это сделать кодом. »
сначала, для каждого типа заголовка нужно создать пару файлов
DXT1_1024x1024.OLD
DXT1_1024x1024.NEW
DXT1_1024x512.OLD
DXT1_1024x512.NEW
DXT1_256x256.OLD
DXT1_256x256.NEW
DXT1_512x512.OLD
DXT1_512x512.NEW
...
это можно сделать НЕХ-редактором, либо на файле с нужным заголовком отработать команду типа:
dd bs=1c count=128 if="mcc001n2b.sdd" of="DXT5_2048x2048.old"
допустим, все *.OLD/*.NEW шаблоны лежат в каталоге с батником, а SDD-файлы в папке C:\TEST,
тогда батник по обработке может быть таким:
@echo off
SETLOCAL EnableDelayedExpansion
(for /r "C:\TEST" %%a in (*.sdd) do (
dd bs=1c count=128 if="%%a" of="%~n0.tmp"2>nul
set "$b="&for %%b in (*.old) do if not defined $b fc /b "%~n0.tmp" "%%b" >nul&& set "$b=%%~nb"
if defined $b if not exist "!$b!.new" (echo File "!$b!.new" not found^^!) else (
dd bs=1c count=128 if="!$b!.new" of="%%a"2>nul
ren "%%a" "%%~na.dds"
)))
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.