Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Оценить код / 25 сообщений из 28, страница 1 из 2
29.03.2016, 18:21
    #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
29.03.2016, 18:45
    #39203558
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оценить код
C#_nub,

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

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

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



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

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

1. сравниваеш char и byte
2. читать побайтно это уже наказуемо.
3. Текст может иметь многобайтовые последовательности. Такая замена убьёт определенней текст.
4. Хороший код раза в два компактней и в 50 эффективней.
5. Правильный код должен с кодировками работать.
...
Рейтинг: 0 / 0
30.03.2016, 11:48
    #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
30.03.2016, 14:58
    #39204219
Denis.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оценить код
Код: c#
1.
 args.ToList().ForEach(fileName => { File.WriteAllText(fileName, File.ReadAllText(fileName).Replace("XPEH", "HEPX")); });
...
Рейтинг: 0 / 0
30.03.2016, 15:02
    #39204222
zz118
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оценить код
Denis.
Код: c#
1.
 args.ToList().ForEach(fileName => { File.WriteAllText(fileName, File.ReadAllText(fileName).Replace("XPEH", "HEPX")); });



C#_nubЛогические косяки пока не искал, хочу другого
...
Рейтинг: 0 / 0
30.03.2016, 15:46
    #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
30.03.2016, 16:43
    #39204339
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оценить код
Denis.
Код: c#
1.
@byte


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



И бинарник "заведётся" после этого?
...
Рейтинг: 0 / 0
30.03.2016, 17:55
    #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
30.03.2016, 18:28
    #39204448
Denis.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оценить код
ИзопропилDenis.
Код: c#
1.
@byte


йад в аптеке
сказал же учит. пусть знает.
...
Рейтинг: 0 / 0
30.03.2016, 18:58
    #39204478
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оценить код
CS_nub1. Char & Byte еще курю, поэтому натыкал явное приведение типов.
Важный момент. Char и Byte разные вещи. Вместо string используй массив Byte[]
...
Рейтинг: 0 / 0
30.03.2016, 21:21
    #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
30.03.2016, 22:38
    #39204619
CS_nub
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оценить код
mikron, олигофрен здесь один - ты. Но мне не трудно, я повторю: "Как раз подвернулась задача пропатчить бинарник ". Отсюда следующее: в какой кодировке придут входные параметры, в такой они будут сравниваться с исходным файлом. Придут в юникоде, значит будет поиск и замена юникодной последовательности. string в приведенном исходнике был выбран для простоты. Далее тратить время на тебя не имею желания.
...
Рейтинг: 0 / 0
30.03.2016, 23:06
    #39204631
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оценить код
Далее без взаимных оскорблений и перехода на личности, предупреждение обоим
...
Рейтинг: 0 / 0
31.03.2016, 08:36
    #39204700
zz118
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оценить код
я смотрю, тут уже вопрос исчерпан=)
...
Рейтинг: 0 / 0
31.03.2016, 09:36
    #39204771
CS_nub
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оценить код
zz118, в принципе, да. сижу читаю доки по указанным всеми участниками ключевым моментам.
...
Рейтинг: 0 / 0
31.03.2016, 10:11
    #39204811
mikron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оценить код
CS_nubmikron, олигофрен здесь один - ты. Но мне не трудно, я повторю: "Как раз подвернулась задача пропатчить бинарник ". Отсюда следующее: в какой кодировке придут входные параметры, в такой они будут сравниваться с исходным файлом. Придут в юникоде, значит будет поиск и замена юникодной последовательности. string в приведенном исходнике был выбран для простоты. Далее тратить время на тебя не имею желания.
Ты не замечаешь разниц. Смотри по пунктам.
- я не сказал что ты олигофрен, я сказал что ты его неубедительно изображаеш. Это не оскорбление. Ты же мне поставил диагноз. Бог с ним, меня не задевает, но почувсвуй разницу.
- ты просил оценить код. Сейчас ссылаешся на задач которую ты решаешь. Код от этого не стал лутше. Если мне такое покажут и скажут что это работает один раз и потом в мусорку я это даже смотреть не буду. Потому что речь о экономичности решения и даже время на это тратить в пустую. Я это уже отметил фразой "код похоже рабочий" Реч о качестве кода, то это не аргумент. Код для мусорки.
- ты не замечаеш разницу между кодировкой и юникодом. Это не одно и тоже. В юникоде тебе ничто не придёт.
- не трать время на отговорки мне, трать на своё образование.
- код громоздкий, не эфективный, безграмотный.
...
Рейтинг: 0 / 0
31.03.2016, 18:04
    #39205398
CS_nub
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оценить код
mikron, я вижу у тебя плохо с русским, поэтому я медленно писать буду. Ты в курсе как делают изменения в исполняемом файле? Берут байт и вместо него записывают другой: CF -> 45. В моем случае замен много и расположение (смещение) их меняется от версии к версии. Поэтому проще написать универсальный патчер, чем ковырять руками. Входные параметры в процедуру патча есть последовательность байт: <ObjectPascal> const Source, Dest: array of Byte; </ObjectPascal> C# я только начал пробовать, и до параметров не добрался, поэтому еще не знаю как правильно передать строку (любую: ansi, koi8-r, utf8, etc...) в функцию, как байтовую последовательность. Поэтому я не стал заморачиваться и использовал string. Для теста хватит за глаза. Теперь всё?
...
Рейтинг: 0 / 0
31.03.2016, 19:35
    #39205436
Иммануил Кант
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оценить код
Код: c#
1.
FileStream fsSource = new FileStream



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

обернуть
...
Рейтинг: 0 / 0
31.03.2016, 19:46
    #39205444
CS_nub
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оценить код
Иммануил Кант, да, выше уже ткнули.
...
Рейтинг: 0 / 0
31.03.2016, 19:55
    #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
31.03.2016, 19:56
    #39205454
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оценить код
CS_nubИммануил Кант, да, выше уже ткнули.
Рихтера прочитай, чтобы не бегать по граблям.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Оценить код / 25 сообщений из 28, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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