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

Узнай цену своей работы

Формулировка задачи:

В папке есть 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 редактирований.

Решение задачи: «Как пропатчить по трем смещениям несколько файлов по нажатию кнопки?»

textual
Листинг программы
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);
                }
            }
        }
    }
}

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы