Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 2
Регистрация: 07.06.2016
Сообщений: 75

Как пропатчить по трем смещениям несколько файлов по нажатию кнопки?

20.08.2017, 22:24. Показов 1643. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В папке есть 55 файлов. Надо сделать, чтоб по нажатию кнопки, произошло умножение значений сразу в 55 файлах по трем смещениям 0x330, 0x340, 0x350, на значение, которое написали в numericUpDown2 (например умножение на 1.5). (В некоторых файлах нужно пропатчивать только по одному или двум смещениям, а не по трем как в большинстве).
Подсказали что надо: Считываешь файл в массив байт, заменяешь нужные и перезаписываешь файлы. Если имена файлов известны, то можно прям в коде имена указать. (Имена файлов: scene1, scene2 и т.д.)

Заметка: Данные в файлах в перевернутом шестнадцетиричном виде. Например 100 000 (десятичное) четырехбайтное значение выглядит в файле: A0 86 01 00, а не 00 01 86 A0. Делается это для упрощения редактирования. Редактирование вручную занимает от 19 до 30 часов, (около трех дней по 7 часов). Потому что есть 6 таких показателей по трем смещениям в 256 файлах, а это 256 * 3 * 6 = 4608 редактирований.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.08.2017, 22:24
Ответы с готовыми решениями:

Как несколько раз заменить текст Label по нажатию на кнопки
Я делаю лабу. типо викторины. И мне надо что бы на форме немялись вопросы. Я не как не могу понять как заменить Label и radioButton. То...

Как динамически создать последовательно несколько TextBox по нажатию кнопки
Уважаемые специалисты C#! Подскажите пожалуйста, как динамически создать несколько TextBox-ов не разом , а последовательно, нажимая на одну...

Как по нажатию кнопки несколько раз выводить текст в TextView в Android Studio?
Помогите вывести текст в textview при нажатии на одну и ту же кнопку ? Нажал - изменился текст, опять нажал и тд

8
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18279 / 14202 / 5368
Регистрация: 17.03.2014
Сообщений: 28,882
Записей в блоге: 1
20.08.2017, 23:25
Лучший ответ Сообщение было отмечено Razi82 как решение

Решение

Razi82, читать и записывать файлы целиком можно, но лучше так не делать. Вместо этого достаточно читать и записывать данные только по нужным смещениям.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
static unsafe void PatchFiles()
{
    long[] offsets = {0x330, 0x340, 0x350};
    byte[] buf4 = new byte[4];
    double mulitplyBy = 1.5;
    foreach (string fileName in Directory.EnumerateFiles(@"c:\SomeFolder", "scene*"))
    {
        using (var fstream = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
        {
            foreach (long offset in offsets)
            {
                if (offset+4 < fstream.Length)
                {
                    fstream.Position = offset;
                    fstream.Read(buf4, 0, 4);
                    
                    int n = (int)(mulitplyBy * BitConverter.ToInt32(buf4, 0));
                    fixed(byte* b = buf4)
                    {
                        *((int*)b) = n;
                    }
                    
                    fstream.Position -= 4;
                    fstream.Write(buf4, 0, 4);
                }
            }
        }
    }
}
2
0 / 0 / 2
Регистрация: 07.06.2016
Сообщений: 75
22.08.2017, 13:08  [ТС]
Для кода нужно поставить в свойствах проекта: разрешить небезопасный код и поставить в свойствах версию .Net на 4-ую. Код чуть подстроен под свои задачи:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    unsafe void PatchFiles()
        {
            long[] offsets = { 0x33C, 0x3F4, 0x4AC };
            byte[] buf4 = new byte[4];
            decimal mulitplyBy = numericUpDownHPMultiplier1.Value;
            foreach (string fileName in Directory.EnumerateFiles(Application.StartupPath + @"\unpacked2", "scene*"))
            {
                using (var fstream = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
                {
                    foreach (long offset in offsets)
                    {
                        if (offset + 4 < fstream.Length)
                        {
                            fstream.Position = offset;
                            fstream.Read(buf4, 0, 4);
 
                            int n = (int)(mulitplyBy * BitConverter.ToInt32(buf4, 0));
                            fixed (byte* b = buf4)
                            {
                                *((int*)b) = n;
                            }
 
                            fstream.Position -= 4;
                            fstream.Write(buf4, 0, 4);
                        }
                    }
                }
            }
        }
OwenGlendower, (Извиняюсь, что раньше не ответил). Помогло, огромное спасибо. (Если смогу доделать, тогда приложение поможет сэкономить до 10-30 часов рутинной работы, не одному человеку).
0
0 / 0 / 2
Регистрация: 07.06.2016
Сообщений: 75
23.08.2017, 23:00  [ТС]
OwenGlendower, А как в коде патчить файлы выборочно? (код в прошлом сообщении) Сейчас обращается сразу ко всем файлам "scene*" foreach (string fileName in Directory.EnumerateFiles(Application.StartupPath + @"\unpacked2", "scene*")). Нужно патчить по трем смещениям файлы выборочно. Как написать например чтоб обращалось только к файлам с "scene9 по scene20" и к файлам "scene30", "scene90"?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18279 / 14202 / 5368
Регистрация: 17.03.2014
Сообщений: 28,882
Записей в блоге: 1
23.08.2017, 23:22
Razi82, например так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
foreach (string fileName in Directory.EnumerateFiles(Application.StartupPath + @"\unpacked2", "scene*"))
{
    Match m = Regex.Match(fileName, "^scene(\d+)$");
    if (m.Success)
    {
        int n = int.Parse(m.Groups[1].Value);
        if ((n>=9 && n<=20) || n==30 || n==90)
        {
            // "scene9 по scene20", "scene30", "scene90"
            // ...
        }
    }
}
1
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764
24.08.2017, 13:01
А я бы лучше прикрутил бы OpenFileDialog, чтобы в нём можно выбрать 1 или несколько нужных файлов и они уже обрабатывались, чтобы не приходилось указывать имена файлов в коде.
0
0 / 0 / 2
Регистрация: 07.06.2016
Сообщений: 75
24.08.2017, 21:26  [ТС]
OwenGlendower, Сделал вот так:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
     unsafe void PatchFiles()
        {
            long[] offsets = { 0x33C, 0x3F4, 0x4AC };
            byte[] buf4 = new byte[4];
            decimal mulitplyBy = numericUpDownHPMultiplier1.Value;
            foreach (string fileName in Directory.EnumerateFiles(Application.StartupPath + @"\unpacked2", "scene*"))
            {
               Match m = Regex.Match(fileName, "^scene(\\d+)$");
               if (m.Success)
               {
               int p = int.Parse(m.Groups[1].Value);
               if ((p>=9 && p<=20) || p==30 || p==90)
               {
                using (var fstream = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
                {
                    foreach (long offset in offsets)
                    {
                        if (offset + 4 < fstream.Length)
                        {
                            fstream.Position = offset;
                            fstream.Read(buf4, 0, 4);
 
                            int n = (int)(mulitplyBy * BitConverter.ToInt32(buf4, 0));
                            fixed (byte* b = buf4)
                            {
                                *((int*)b) = n;
                            }
 
                            fstream.Position -= 4;
                            fstream.Write(buf4, 0, 4);
                        }
                    }
                }
               }
               }
            }
        }

Но, сначало выдало ошибки (скриншот внизу): 1) Не удалось найти имя типа или пространства имен "Match" (пропущена директива using или ссылка на сборку?)
2) Элемент "Regex" не существует в текущем контексте.
Эти две ошибки были исправлены путем того, что поставил в начало файла From1.cs директиву using System.Text.RegularExpressions;
3)Ошибка. Нераспознанная управляющая последовательность.
Нагуглил ответ, что надо добавить перед выражением "@" или добавить еще один слэш "\" вот так: Match m = Regex.Match(fileName, @"^scene(\d+)$"); или Match m = Regex.Match(fileName, "^scene(\\d+)$");
Ошибок нет, но не патчит файлы. Возможно ошибка в исправлении: Match m = Regex.Match(fileName, "^scene(\\d+)$"); Подскажите где сделана ошибка? (.net framework выставлен на 4-ую версию)
Миниатюры
Как пропатчить по трем смещениям несколько файлов по нажатию кнопки?  
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18279 / 14202 / 5368
Регистрация: 17.03.2014
Сообщений: 28,882
Записей в блоге: 1
24.08.2017, 21:41
Razi82, fileName содержит полный путь и поэтому Match не срабатывает. Нужно так исправить:
C#
1
Match m = Regex.Match(Path.GetFileName(fileName), @"^scene(\d+)$");
1
0 / 0 / 2
Регистрация: 07.06.2016
Сообщений: 75
24.08.2017, 21:53  [ТС]
OwenGlendower, Отлично, работает, спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.08.2017, 21:53
Помогаю со студенческими работами здесь

Как по нажатию одной кнопки сделать аплоад сразу трех файлов?
Есть три штуки &lt;input type=file ...&gt; Как по нажатию одной кнопки сделать аплоад сразу трех файлов

Вывод в TextBox, Использование встроенного класса в компиляции, добавление файлов в ресурсы по нажатию кнопки
Привет! Забросил c#, начал обрастать жиром (начинал изучать на тот момент). Тут взял и почти все забыл... Делаю только ради того,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru