powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Оценить код
25 сообщений из 28, страница 1 из 2
Оценить код
    #39203529
C#_nub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Жентельмены, делаю первые попытки мигрировать с Delphi на C#. Как раз подвернулась задача пропатчить бинарник. Накидал код, вроде работает. Логические косяки пока не искал, хочу другого. Копчиком чувствую, что из кода торчат уши паскаля, поэтому хотелось бы увидеть нечто более "правильное". Если не трудно, конечно. Отлов исключений пока не требуется.

Код: 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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
namespace Patch
{
    class Program
    {
        static void Main(string[] args)
        {
            string sSource = "XPEH";
            string sDest = "HEPX";

            foreach (string FileName in args)
            {
                FileStream fsSource = new FileStream(FileName, FileMode.Open, FileAccess.ReadWrite);

                int iByte;

                do
                {
                    iByte = fsSource.ReadByte();

                    if (iByte > -1)
                    {
                        if (iByte == sSource[0])
                        {
                            bool bIsEqual = false;

                            long lOffset = fsSource.Position;

                            foreach (char cByte in sSource)
                            {                               
                                if (iByte > -1)
                                {
                                    bIsEqual = (iByte == (int)cByte);
                                    if (!bIsEqual)
                                    {
                                        break;
                                    }
                                }

                                iByte = fsSource.ReadByte();
                            }

                            if (!bIsEqual)
                            {
                                fsSource.Seek(lOffset, SeekOrigin.Begin);
                            }
                            else
                            {
                                fsSource.Seek(lOffset - 1, SeekOrigin.Begin);

                                foreach (char cByte in sDest)
                                {
                                    fsSource.WriteByte((byte)cByte);
                                }

                            }
                        }
                    }

                } while (iByte > -1);

                fsSource.Close();
            }
        }
    }
}
...
Рейтинг: 0 / 0
Оценить код
    #39203558
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C#_nub,

Жалко что тут форум не по C#
...
Рейтинг: 0 / 0
Оценить код
    #39203561
C#_nub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky, а он вообще есть на sql.ru?
...
Рейтинг: 0 / 0
Оценить код
    #39203588
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть форум

Слабо понял о чем код (ты бы хоть камменты вставил или вкратце описал что делаешь).

из лишнего особо ничего не заметил, разве что можно писать
Код: c#
1.
fsSource.Position = ...



Модератор: Тема перенесена из форума "C++".
...
Рейтинг: 0 / 0
Оценить код
    #39203686
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C#_nub,

Код похож на рабочий, в остальном полная хрень. Дело далеко не в языке.

1. сравниваеш char и byte
2. читать побайтно это уже наказуемо.
3. Текст может иметь многобайтовые последовательности. Такая замена убьёт определенней текст.
4. Хороший код раза в два компактней и в 50 эффективней.
5. Правильный код должен с кодировками работать.
...
Рейтинг: 0 / 0
Оценить код
    #39203964
zz118
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C#_nub,

Код: c#
1.
FileStream fsSource = new FileStream(FileName, FileMode.Open, FileAccess.ReadWrite);



https://msdn.microsoft.com/ru-ru/library/yh598w02.aspx

Код: c#
1.
int iByte;



Венгерская нотация мертва

Код: c#
1.
2.
3.
do
{
    iByte = fsSource.ReadByte();



http://stackoverflow.com/questions/3160907/how-can-make-my-file-reading-class-return-an-ienumerablebyte-object

Код: c#
1.
foreach (string FileName in args)



Вкусовщина, но лучше так:

Код: c#
1.
foreach (var fileName in args)
...
Рейтинг: 0 / 0
Оценить код
    #39204219
Фотография Denis.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
 args.ToList().ForEach(fileName => { File.WriteAllText(fileName, File.ReadAllText(fileName).Replace("XPEH", "HEPX")); });
...
Рейтинг: 0 / 0
Оценить код
    #39204222
zz118
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis.
Код: c#
1.
 args.ToList().ForEach(fileName => { File.WriteAllText(fileName, File.ReadAllText(fileName).Replace("XPEH", "HEPX")); });



C#_nubЛогические косяки пока не искал, хочу другого
...
Рейтинг: 0 / 0
Оценить код
    #39204271
Фотография Denis.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если ничего не менять то так
Код: 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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
sealed class Program
    {
        static void Main(string[] args)
        {
            const string SOURCE = "XPEH";
            const string TARGET = "HEPX";

            foreach (var fileName in args)
            {
                using (var stream = File.Open(fileName, FileMode.Open, FileAccess.ReadWrite))
                {
                    int @byte;
                    while ((@byte = stream.ReadByte()) > -1)
                    {
                        if (@byte != SOURCE[0])
                            continue;

                        var offset = stream.Position;

                        var isMatch = true;
                        foreach (var cByte in SOURCE)
                        {
                            if (@byte != cByte)
                            {
                                isMatch = false;
                                break;
                            }
                            @byte = stream.ReadByte();
                        }

                        if (isMatch)
                        {
                            stream.Seek(offset - 1, SeekOrigin.Begin);
                            foreach (var letter in TARGET)
                                stream.WriteByte((byte)letter);
                        }
                        else
                        {
                            stream.Seek(offset, SeekOrigin.Begin);
                        }

                    }
                }
            }
        }
    }
...
Рейтинг: 0 / 0
Оценить код
    #39204339
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis.
Код: c#
1.
@byte


йад в аптеке
...
Рейтинг: 0 / 0
Оценить код
    #39204396
Фотография LocksmithPC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot zz118]Denis.
Код: c#
1.
 args.ToList().ForEach(fileName => { File.WriteAllText(fileName, File.ReadAllText(fileName).Replace("XPEH", "HEPX")); });



И бинарник "заведётся" после этого?
...
Рейтинг: 0 / 0
Оценить код
    #39204408
CS_nub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mikronC#_nub,
1. сравниваеш char и byte
2. читать побайтно это уже наказуемо.
3. Текст может иметь многобайтовые последовательности. Такая замена убьёт определенней текст.
4. Хороший код раза в два компактней и в 50 эффективней.
5. Правильный код должен с кодировками работать.


1. Char & Byte еще курю, поэтому натыкал явное приведение типов.
2. Перестал боятся побайтного чтения в 94-м году, когда затолкнул в autoexec.bat smartdrv.exe. И вам пора избавиться от фобии.
3. По смыслу задачи унописуально какая будет кодировка входных параметров и исходного файла.
4. Сначала надо понять как это работает, и только потом использовать однострочные конструкции с вызовом десятка функций.
5. См. п. 3.
...
Рейтинг: 0 / 0
Оценить код
    #39204448
Фотография Denis.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDenis.
Код: c#
1.
@byte


йад в аптеке
сказал же учит. пусть знает.
...
Рейтинг: 0 / 0
Оценить код
    #39204478
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CS_nub1. Char & Byte еще курю, поэтому натыкал явное приведение типов.
Важный момент. Char и Byte разные вещи. Вместо string используй массив Byte[]
...
Рейтинг: 0 / 0
Оценить код
    #39204576
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CS_nubmikronC#_nub,
1. сравниваеш char и byte
2. читать побайтно это уже наказуемо.
3. Текст может иметь многобайтовые последовательности. Такая замена убьёт определенней текст.
4. Хороший код раза в два компактней и в 50 эффективней.
5. Правильный код должен с кодировками работать.


1. Char & Byte еще курю, поэтому натыкал явное приведение типов.
2. Перестал боятся побайтного чтения в 94-м году, когда затолкнул в autoexec.bat smartdrv.exe. И вам пора избавиться от фобии.
3. По смыслу задачи унописуально какая будет кодировка входных параметров и исходного файла.
4. Сначала надо понять как это работает, и только потом использовать однострочные конструкции с вызовом десятка функций.
5. См. п. 3.
Ненадо тешить своё самолюбие. Ты спросил - ты получил. Ломаеш из себя не понятого(4) энтузиаста(2) олегофрена(3).
Хочешь возразить - попробуй аргументировать не своим отношением к задаче а объективными критериями.
1. Почитай
2. Замерь скорость
3. "кодировка входных параметров" в твоём коде отсутсвует как сущность. "кодировка исходного файла" - Он у тебя один. По коду - текстовый. Ты утверждаеш, что результат всегда "правильный" вне зависимости от кодировки файла. Глупости. UTF8, многобайтобые последовательности, второй байт со значением твоего первого символа для поиска.
4. гениальный код, безусловно. Можно использовать как рвотное без побочных эффектов. Какие такие "однострочные конструкции"? Товарисч, вы о чём?
...
Рейтинг: 0 / 0
Оценить код
    #39204619
CS_nub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mikron, олигофрен здесь один - ты. Но мне не трудно, я повторю: "Как раз подвернулась задача пропатчить бинарник ". Отсюда следующее: в какой кодировке придут входные параметры, в такой они будут сравниваться с исходным файлом. Придут в юникоде, значит будет поиск и замена юникодной последовательности. string в приведенном исходнике был выбран для простоты. Далее тратить время на тебя не имею желания.
...
Рейтинг: 0 / 0
Оценить код
    #39204631
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Далее без взаимных оскорблений и перехода на личности, предупреждение обоим
...
Рейтинг: 0 / 0
Оценить код
    #39204700
zz118
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я смотрю, тут уже вопрос исчерпан=)
...
Рейтинг: 0 / 0
Оценить код
    #39204771
CS_nub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zz118, в принципе, да. сижу читаю доки по указанным всеми участниками ключевым моментам.
...
Рейтинг: 0 / 0
Оценить код
    #39204811
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CS_nubmikron, олигофрен здесь один - ты. Но мне не трудно, я повторю: "Как раз подвернулась задача пропатчить бинарник ". Отсюда следующее: в какой кодировке придут входные параметры, в такой они будут сравниваться с исходным файлом. Придут в юникоде, значит будет поиск и замена юникодной последовательности. string в приведенном исходнике был выбран для простоты. Далее тратить время на тебя не имею желания.
Ты не замечаешь разниц. Смотри по пунктам.
- я не сказал что ты олигофрен, я сказал что ты его неубедительно изображаеш. Это не оскорбление. Ты же мне поставил диагноз. Бог с ним, меня не задевает, но почувсвуй разницу.
- ты просил оценить код. Сейчас ссылаешся на задач которую ты решаешь. Код от этого не стал лутше. Если мне такое покажут и скажут что это работает один раз и потом в мусорку я это даже смотреть не буду. Потому что речь о экономичности решения и даже время на это тратить в пустую. Я это уже отметил фразой "код похоже рабочий" Реч о качестве кода, то это не аргумент. Код для мусорки.
- ты не замечаеш разницу между кодировкой и юникодом. Это не одно и тоже. В юникоде тебе ничто не придёт.
- не трать время на отговорки мне, трать на своё образование.
- код громоздкий, не эфективный, безграмотный.
...
Рейтинг: 0 / 0
Оценить код
    #39205398
CS_nub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mikron, я вижу у тебя плохо с русским, поэтому я медленно писать буду. Ты в курсе как делают изменения в исполняемом файле? Берут байт и вместо него записывают другой: CF -> 45. В моем случае замен много и расположение (смещение) их меняется от версии к версии. Поэтому проще написать универсальный патчер, чем ковырять руками. Входные параметры в процедуру патча есть последовательность байт: <ObjectPascal> const Source, Dest: array of Byte; </ObjectPascal> C# я только начал пробовать, и до параметров не добрался, поэтому еще не знаю как правильно передать строку (любую: ansi, koi8-r, utf8, etc...) в функцию, как байтовую последовательность. Поэтому я не стал заморачиваться и использовал string. Для теста хватит за глаза. Теперь всё?
...
Рейтинг: 0 / 0
Оценить код
    #39205436
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
FileStream fsSource = new FileStream



это лучше в
Код: c#
1.
using

обернуть
...
Рейтинг: 0 / 0
Оценить код
    #39205444
CS_nub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Иммануил Кант, да, выше уже ткнули.
...
Рейтинг: 0 / 0
Оценить код
    #39205452
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CS_nub Берут байт и вместо него записывают другой: CF -> 45.
уже писал выше, используй массив байт
Код: c#
1.
var sSource = new Byte[] { 65, 66, 67};


в C# используется юникод, поэтому
Код: c#
1.
if(iByte == 'A')


и
Код: c#
1.
if(iByte == 65)


Работает одинаково, но по скорости отличаются в разы. Второе быстрее.

PS mikron`а именно этим и запутал, он увидел в начале string, а дальше чукча писатель. Замени string на Byte[] и будет все смотреться гармонично.
...
Рейтинг: 0 / 0
Оценить код
    #39205454
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CS_nubИммануил Кант, да, выше уже ткнули.
Рихтера прочитай, чтобы не бегать по граблям.
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Оценить код
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]