Войти

Показать полную графическую версию : автоматический поиск и замена HEX в файлах


Страниц : 1 [2]

Tosyk
08-12-2010, 13:53
Отлично, всё работает! А как заставить его:

1 - находить *. sdd файлы вглубь по каталогам и преобразовывать
2 - конвертировать файл при перетаскивании его на *.bat файл, конвертировать только этот файл, даже если в этом каталоге присутствуют другие

для первого это может быть вот так?:@echo off
SETLOCAL EnableDelayedExpansion

(for /F "Tokens=*" %%a In ('Dir /B /S "*. 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"
)))

а вот по второму пункту я даже незнаю что можно сделать.

amel27
08-12-2010, 14:50
1. да вроде он итак должен искать в подкаталогах - см. "HELP FOR" для ключа /R:
FOR /R [[диск:]путь] %переменная IN (набор) DO команда [параметры]

Выполнение команды для каталога [диск:]путь, а также для всех
подкаталогов этого пути. Если после ключа /R не указано имя каталога,
выполнение команды начинается с текущего каталога.
Если вместо набора указана только точка (.), команда выводит список
всех подкаталогов.

Tosyk
08-12-2010, 14:53
Понятно, а как по второму пункту:

2 - конвертировать файл при перетаскивании его на *.bat файл, конвертировать только этот файл, даже если в этом каталоге присутствуют другие »
?

ДОБАВКА:
возможно ли сделать конвертирование из мастер файла, т.е. не создавать для каждого типа свой файл *.new и *.old?

ДОБАВКА2:
Мне кажется нужно воспользоваться вашим предложением
если определить интервалы размеров для каждого типа, то можно и по размеру »
потому что пар (*.new/*.old) уже набралось около 30, а размеры типов вариируются +/- 1 байт.

Если сделать подстановку по диапазону размеров, то как будет скрипт выглядеть?

ДОБАВКА3:
А вы знаете каконибудь компилятор bat/cmd что при его выполнении не мелькало окошко cmd (что происходит в большинстве таких программ), а чтобы появлялось окошко с заполняющейся полоской, как при инсталяции?

amel27
09-12-2010, 13:28
а как по второму пункту »решается без проблем разбором параметров командной строки батника

пар (*.new/*.old) уже набралось около 30, а размеры типов вариируются +/- 1 байт.
Если сделать подстановку по диапазону размеров, то как будет скрипт выглядеть? »смысла большого не вижу - короче не будет, но будет запутанней сам алгоритм: сэкономим только на OLD-шаблонах (вместо них будет некое значение интервала), а правильное значение блока всё равно придется брать из NEW-шаблонов, кроме того встанет проблема соответствия между числом-интервалом и файлом NEW-шаблона

возможно ли сделать конвертирование из мастер файла, т.е. не создавать для каждого типа свой файл *.new и *.old? »не совсем понял вопрос, всё равно перед сравнением придется выдергивать нужный блок из этого файла, а это дополнительные затраты на код и его выполнение... единственный достойный внимания вариант - хранить блоки в переменных самого батника (само собой, в HEX-виде), но для этого нужен достаточно мощный командный HEX-процессор (типа SFK), который мог бы считывать/записывать файловые блоки HEX <--> BIN, тогда блок данных батника мог бы быть таким (для одного типа):
set DXT5_2048x2048_OLD=205344440000007C000A1007000008000000080000400000000000000000000C
set DXT5_2048x2048_NEW=444453207C00000007100800000800000008000000004000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000020000000040000004458543500000 000000000000000000000000000000000000010000000000000000000000000000000000000


P.S. здесь я предположил, что для идентификации типа файла достаточно первых 32 байт заголовка

А вы знаете каконибудь компилятор bat/cmd что при его выполнении не мелькало окошко cmd »извиняюсь, но не совсем понимаю, когда сначала выбирают консольный вариант исполнения задачи, а потом стараются стыдливо прятать его за оконный интерфейс... или ещё хлеще - насмотревшись вдоволь на унылый прогресс-бар, пытаются воспроизвести аналог консольного окошка, в которое тупо копипастят вывод скрытого CMD-окна

Tosyk
09-12-2010, 17:32
извиняюсь, но не совсем понимаю, когда сначала выбирают консольный вариант исполнения задачи, а потом стараются стыдливо прятать его за оконный интерфейс... или ещё хлеще - насмотревшись вдоволь на унылый прогресс-бар, пытаются воспроизвести аналог консольного окошка, в которое тупо копипастят вывод скрытого CMD-окна »
Ну вобщем то выбрал консольный вариант потому что с ним удобнее управляться, и он более гибкий, как инструмент. А спрашиваю о преобразовании в оконный интерфейс потому, что делаю этот скрипт не для себя, а в основном для людей.

amel27
10-12-2010, 11:29
Tosyk, мы уже обсудили три возможных подхода:

- на базе DD, библиотека шаблонов состоит из пар OLD/NEW файлов-заголовков;
- на базе DD, библиотека шаблонов состоит из пар: NEW-заголовок-файл + размер OLD-файла;
- на базе SFK, библиотека шаблонов состоит из пар HEX-переменных, описывающих NEW/OLD заголовки

- определитесь с выбором,
- сформируйте соответствующую библиотеку шаблонов (3-5 типов),
- создайте тестовую структуру каталогов (хотя бы по 1 файлу каждого типа),
- запакуйте и выложите в студию

только в этом случае имеет смысл двигаться дальше и ваять готовый код

с ним удобнее управляться, и он более гибкий, как инструмент. А спрашиваю о преобразовании в оконный интерфейс потому, что делаю этот скрипт не для себя, а в основном для людей. »дело вкуса... но для GUI я бы выбрал что-нибудь типа HTA/AutoIT/AHK, а из них при желании можно задействовать все возможности CMD

Tosyk
14-12-2010, 15:36
Прошу прощения за задержку.

Выкладываю архив с библитекой шаблонов и тестовой структурой файлов.

скачать тут (http://www.mediafire.com/?kdrj75w0lzux0tb)

Как я уже упомянал выше: можно ли использовать информацию о размере файлов для определения типа?

вот что я исследовал:

4 kb - DXT1 64x64
12 kb - DXT1 128x128
44 kb - DXT1 256x256
171 kb - DXT1 512x512
172 kb - DXT1 512x512
342 kb - DXT5 512x512
683 kb - DXT1 1024x1024
684 kb - DXT1 1024x1024
1366 kb - DXT1 2048x1024
2732 kb - DXT1 2048x2048

если проводить изменение по заголовку то велика вероятность того, что я должен буду проверить HEX'ом все файлы или почти все (повторю, что их около 10000) на предмет различия в заголовках, чтобы не пропустить какой-то тип. А при этом сама суть задумки автоматизации пропадёт.

Если ту же операцию можно повторить с помощью SFK, но только кодом, то это предпочтительнее.

Посмотрел программы HTA/AutoIT/AHK, и что то не совсем понимаю, как с помощью них сделать простой прогресс-бар (

Tosyk
31-12-2010, 03:41
Приветствую, прошу прощения за дабл-пост.

Уважаемый товарищ amel27, не хотелось бы останавливаться на пол пути.

sov44
21-10-2020, 23:04
Подскажите способ, как заменить в autorun.dll все совпадения "sources\setup.exe" на "sources\set86.exe" и(или) "Sources\setep.exe" на "Sources\set86.exe", с сохранением в новый файл.

greg zakharov
22-10-2020, 23:39
sov44, про bsdiff\bspacth что-нибудь знаете? bspacth, к слову, в инсталляторе JRE используется даже.

sov44
23-10-2020, 00:10
sov44, про bsdiff\bspacth что-нибудь знаете? bspacth, к слову, в инсталляторе JRE используется даже. »
greg zakharov, не знаком. Пытаюсь применить утилиту Swiss File Knife (https://sourceforge.net/projects/swissfileknife), но пока безуспешно.

upd. решено
@echo off
>nul copy /y autorun.dll out.dll

sfk197.exe rep out.dll -bin /6F00750072006300650073005C00730065007400750070002E00650078006500/6F00750072006300650073005C00730065007400380036002E00650078006500/ -yes

pause
exit

m0nkrus
04-11-2021, 11:07
Задача следующая: у всех файлов в папке удалить первый байт!

Мне уже предложили скрипт на PowerShell. И он даже неплохо работает, пока размер обрабатываемого файла не превышает некую критическую величину около 100 Мб. Там происходит переполнение массива и вылет в ошибку. Поэтому хотелось бы какую-то альтернативу.

DD пробовал - тоже проблема с большими файлами. Вот команда:
dd bs=1c skip=1 if="file1" of="file2" --progress
Файл взял на 525 Мб. За те 2 часа, что я ждал завершения операции, было переработано примерно 250 Мб. Все из-за того, что размер блока устанавливается для всего единый. То есть установил я 1 байт для изъятия, вот программа и перерабатывает дальше громадный файл по одному байту....

Есть какие-то более подходящие решения под мой запрос?

Iska
04-11-2021, 11:23
m0nkrus, вышеуказанный Swiss File Knife download | SourceForge.net (https://sourceforge.net/projects/swissfileknife/) не рассматривали?

YuS_2
04-11-2021, 11:38
пока размер обрабатываемого файла не превышает некую критическую величину около 100 Мб. »
Для того, чтобы такого не происходило, есть разные способы чтения файлов... например, потоковое чтение io.streamreader, вполне возможно считывать файл размером и больше гигабайта, не говоря уже про мегабайты...

Что-то типа:
$file = 'test.tst'
$out = 'out.tst'
$reader = [io.streamreader]::new($file)
$writer = [io.streamwriter]::new($out)
$reader.basestream.position = 1
while ($reader.basestream.position -lt $reader.basestream.length){
$writer.basestream.writebyte($reader.basestream.readbyte())
}
$reader.basestream.close()
$writer.basestream.close()
- можно там попытаться ускорить чтение-запись, но это уже зависит от задачи... насколько часто требуется, если разовая - вполне будет достаточно и такого варианта, только прикрутить чтение каталогов и работу со списком файлов, если же часто - то можно поломать голову, как ускориться

m0nkrus
04-11-2021, 13:54
Iska, не очень представляю, какой синтаксис мне в этой этой программе мог бы помочь...


YuS_2, я честно скажу: я сам лично в PowerShell ни в зуб ногой. Вот скрипт, вашего же, кстати, производства, что я сейчас использую: http://forum.oszone.net/post-2956811.html#post2956811
Если сможете порекомендовать, как его усовершенствовать, чтобы он работал и с большими файлами, я буду только рад! Только давайте тогда в той теме и продолжим. Здесь все-таки шел запрос на CMD /BAT.

P.S. Задача не разовая, увы. Поэтому и задалбывает каждый раз выдергивать из массива большие файлы, чтобы в них вручную через HxD срезать этот чертов байт, после чего возвращать их назад, пытаясь не ошибиться в дереве папок.

YuS_2
04-11-2021, 18:36
Только давайте тогда в той теме и продолжим. »
смотрите в той теме...

Serguei Kouzmine
06-11-2021, 05:49
неужели никто не смотрел
https://stackoverflow.com/questions/14893094/java-library-for-reading-and-writing-dds-textures
2
ссылки
оттуда:


бат файлы и кмд не потянут а по какой нибудь из приведенных неаерняка просто есть решение на высоком уровне без копания в хексе
...

All these links are related to reading and converting DDS image.

https://github.com/Dahie/DDS-Utils

http://www.javaworld.com/javaworld/javatips/jw-javatip43.html?page=1

http://www.omg.org/spec/DDS-Java/1.0/Beta2/

https://www.java2s.com/Open-Source/Java/Java-3D/ferox-gl/com/ferox/util/texture/loader/DDSTexture.java.htm

http://code.google.com/p/java-dds/

http://nuicode.svnrepository.com/svn/community-earth/CommunityEarth%20-%20NBProject/src/gov/nasa/worldwind/formats/dds/DDSConverter.java

http://www.guyford.co.uk/showpage.php?id=122&page=Creating_a_Texture_from_a_Buffered_Image_in_JOGL




© OSzone.net 2001-2012