Войти

Показать полную графическую версию : Замена текста с помощью VBScript при условии?!


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

Iska
15-08-2018, 09:34
думал об более быстром варианте. »
Код для PowerShell я приводил здесь же ранее. Кроме того, к Вашим услугам AutoIt, AutoHotKey и куча языков высокого уровня.

YuS_2
15-08-2018, 12:21
На PowerShell это может выглядеть так »
Если говорить о powershell, можно, конечно, и с бинарными данными "поработать":
$bytes = [io.file]::readallbytes("client.dll")
[byte[]]$rep = [int[]][char[]]'1401'
[byte[]]$fin = [int[]][char[]]"dota_camera_pitch_max$([char]0x00+[char]0x00+[char]0x00)1134"
$i = -1
$a = -join $fin
do {
$i++
if($bytes[$i] -eq $fin[0]){
$b = -join $bytes[$i..($i+$fin.count-1)]
}
} while ($a -ne $b)
for($n=0;$n -lt $rep.count;$n++){
$bytes[$i+24+$n] = $rep[$n]
}
[io.file]::writeallbytes("client1.dll", $bytes)
но скорость такого "зверского" поиска:
Days : 0
Hours : 0
Minutes : 1
Seconds : 46
Milliseconds : 912
Ticks : 1069122715
TotalDays : 0,00123741054976852
TotalHours : 0,0296978531944444
TotalMinutes : 1,78187119166667
TotalSeconds : 106,9122715
TotalMilliseconds : 106912,2715
в отличие от работы с текстом:
(gc client.dll -raw) -replace '(?<=dota_camera_pitch_max\x00{3})1134','1401'|set-content client2.dll -non
Days : 0
Hours : 0
Minutes : 0
Seconds : 3
Milliseconds : 979
Ticks : 39799266
TotalDays : 4,60639652777778E-05
TotalHours : 0,00110553516666667
TotalMinutes : 0,06633211
TotalSeconds : 3,9799266
TotalMilliseconds : 3979,9266

Разобрался. у меня порядка минуты уходит что бы выполнился этот код. очень долго. »
Если изменяемые значения находятся по перманентному адресу смещения (т.е. адрес изменяемых данных в файле не меняется), то это будет значительно быстрее...

Iska
15-08-2018, 12:29
(gc client.dll -raw) -replace '(?<=dota_camera_pitch_max\x00{3})1134','1401'|set-content client.dll -non »
Мне не нравится такой вариант тем, что, насколько я понимаю, файл будет пересоздаваться всякий раз, независимо от того, было ли совпадение шаблона, або нет.

но скорость такого "зверского" поиска:
не впечатлила »
С чем сие связываете?

YuS_2
15-08-2018, 12:47
файл будет пересоздаваться всякий раз, независимо от того, было ли совпадение шаблона, або нет. »
Это да, проверки нет в коде, но это ведь несложно осуществить...

С чем сие связываете? »
Так ведь это даже не поиск шаблона, а последовательный перебор массива... и да, там тоже нет проверки на существование значения и соответственно корректного выхода из цикла тоже нет, просто не стал даже заморачиваться в виду такой "производительности"...

Iska
15-08-2018, 13:42
а последовательный перебор массива... »
Хмм… Неужто это даже медленнее работы со строками на WSH?

YuS_2
15-08-2018, 14:49
Неужто это даже медленнее работы со строками на WSH? »
Со строками или с массивом текста?
Да и в любом случае, перебор массива (в данном случае массива символов, не строк) - затратная операция.

Iska
15-08-2018, 23:32
Со строками или с массивом текста? »
Со строками. Вот эти вот:
For i = 1 To LenB(arrByteArray)
strValue = strValue & Right("00" & Hex(AscB(MidB(arrByteArray, i, 1))), 2)
Next

в ConvertByteArray2HexString(arrByteArray) для доступа к содержимому байтового массива. Массив строк же сугубо для минимизации временны́́х затрат при выделении памяти при конкатенации строк — мы заменяем повторённое N раз strContent = strContent & "bla-bla-bla" на одну strContent = Join(arrContent, "") (теоретически там должны быть те же N конкатенаций с теми же всё возрастающими размерами конечной строки с теми же временны́́ми затратами при выделении памяти, но по факту, при стомегабайтных строках — намного, намного ниже).

Кстати, надо бы и с strValue = strValue & Right("00" & Hex(AscB(MidB(arrByteArray, i, 1))), 2) поэкспериментировать аналогичным образом, может тогда получится увеличить размер буфера чтения (он же размер массива arrByteArray).

Да и в любом случае, перебор массива (в данном случае массива символов, не строк) - затратная операция. »
Да ладно :). Или массив в .Net/PowerShell какой-то не совсем «массив».

Iska
16-08-2018, 06:26
Кстати, надо бы и с strValue = strValue & Right("00" & Hex(AscB(MidB(arrByteArray, i, 1))), 2) поэкспериментировать аналогичным образом, может тогда получится увеличить размер буфера чтения (он же размер массива arrByteArray). »
Поэкспериментировал. Как и подозревал, в данном месте существенной разницы от замены простой конкатенации строк в цикле на присвоение значений массиву строк и его Join()'у по выходу из цикла — не обнаружилось. Оно и понятно — тут-то мы манипулируем в небольших пределах строки — размера буфера (он же размер байтового массива, он же размер порции чтения из файла), это же не конкатенация строки размером в сотню мегабайт, как могло бы быть в основном теле скрипта (вместо использования Join()). В том месте замена конкатенации на Join() имело существенное значение, в этом же месте — не имеет.

Также обнаружилось, что оптимальные значения размера буфера лежат в интервале от 256 до 2048 байт, изменение размера буфера в меньшую или большую сторону приводит к увеличению времени исполнения (весьма забавно, что интуитивно выбранное значение в 512 байт оказалось по факту, пожалуй, наилучшим выбором — для данного конкретного случая, конечно).

YuS_2
16-08-2018, 06:30
Со строками »
Или массив в .Net/PowerShell какой-то не совсем «массив». »
Воот... массив-то, он массив, но его перебор, причем посимвольный, не построчный, так как:
$bytes = [io.file]::readallbytes("client.dll")
- массив байтов, по сути, а я его пытался парсить циклом со счетчиком...
возможно и есть более правильные варианты, но увы знаний у меня по ним нет...

Iska
16-08-2018, 10:03
можно, конечно, и с бинарными данными "поработать": »
Не-не-не, это нещщитово — никаких строк, никаких -join'ов. Только массивы, только байты, только хардкор! :lol: И там, кстати, ещё медленнее выйдет, нежели с приведённым вариантом со сравнением первого байта, а затем цельной строки шаблона. Почти в два раза медленнее.

YuS_2
16-08-2018, 12:08
Не-не-не, это нещщитово — никаких строк, никаких -join'ов. »
чойта? кто запретил?
Работаем со всеми доступными методами, главное - результат, а он, увы не впечатляет :)

И там, кстати, ещё медленнее выйдет, нежели с приведённым вариантом со сравнением первого байта, а затем цельной строки шаблона. Почти в два раза медленнее. »
Ну, дык, это и было попыткой ускориться :)
А первоначально, вообще, была стопка вложенных условий... но разница не особо большая получилась :)

Iska
16-08-2018, 13:08
чойта? кто запретил?
Работаем со всеми доступными методами, главное - результат, а он, увы не впечатляет »
Ну, это я, понятное дело, шучу так ;): работаем старыми проверенными дедовскими способами — и точка!

А первоначально, вообще, была стопка вложенных условий... »
Ну, я парой обошёлся (и то — мне кажется какой-то кривовастенькой получившаяся реализация).

x0r
16-08-2018, 13:17
ByteKiller (http://blackstar.clanbb.ru/viewtopic.php?id=517) или всемизвестный diablo2oo2's Universal Patcher - [dUP] - a freeware patch generator (https://dup-patcher.blogspot.com/) ....уже всёб сделали, пока вы тута переписуетеся http://www.kolobok.us/smiles/icq/smile.gif

Iska
16-08-2018, 13:52
x0r, Вы что — тему не читали? Автор не жаждет подобным пользоваться. Я ему зараз предлагал.

x0r
16-08-2018, 14:24
Iska, да читал я... подумал, что со второго раза, мож одумаюццо люди, да возьмут норм. способ.

Hraniti
17-08-2018, 03:13
Iska, да, хотелось какого то более удобного способа. С таким же успехом у могу клавиатуру с мышкой запрограммировать они в секунду будут подобную процедуру делать. просто хочется сделать это перед запуском по умолчанию.

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

Iska
17-08-2018, 05:50
С таким же успехом у могу клавиатуру с мышкой запрограммировать они в секунду будут подобную процедуру делать. »
«С таким же успехом» — не запрограммируете. Никак. Совсем. На воспроизводимость операций вида тык-тык-тык и щёлк-щёлк-щёлк влияет куча внешних факторов, в отличие от нормального программирования.

Hraniti
17-08-2018, 05:51
Iska, при запуске есть консоль которая может работать до запуска самого приложения, соответственно можно было бы автоматизировать.

Iska
17-08-2018, 06:28
Hraniti, а причём тут консоль, когда Вы ведёте речь про:
могу клавиатуру с мышкой запрограммировать они в секунду будут… »

Hraniti
17-08-2018, 07:06
Iska, В общем не хочу в полемики в ходить, я считаю что все должно быть автоматизировано. используя старинной софт это уже как усложненно. Нужно что бы все было просто, нажал 1 раз и все запустилось как нужно.




© OSzone.net 2001-2012