powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / IL-программка
9 сообщений из 9, страница 1 из 1
IL-программка
    #39625289
Ginko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Текстовая строка может выглядеть как "text" либо "41text41".

Подскажите в IL-кодах, как определить и удалить нежелательную подстроку "41" в начале и в конце строки.
...
Рейтинг: 0 / 0
IL-программка
    #39625294
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ginko, пишешь консольную программу "41text41".Replace("41",string.Empty), компилируешь, дизассемблируешь с помощью ILDasm.exe, смотришь
...
Рейтинг: 0 / 0
IL-программка
    #39625301
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эту операцию можно сделать энным количеством разных способов - начиная от вышеупомянутого Relpace (который еще удалит 41 внутри строки, даже если символы 41 хвостовыми не являются), и заканчивая linq:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
var str = "4182569841";
Console.WriteLine(Regex.Replace(str, "^41|41$", string.Empty));
var str1 = str.Substring(str.StartsWith("41", StringComparison.OrdinalIgnoreCase) ? 2 : 0);
str1 = str1.Substring(0, str1.EndsWith("41", StringComparison.OrdinalIgnoreCase) ? str1.Length - 2 : str1.Length);
Console.WriteLine(str1);
var str2 = str.StartsWith("41", StringComparison.OrdinalIgnoreCase) ? str.TrimStart('4', '1') : str;
str2 = str2.EndsWith("41", StringComparison.OrdinalIgnoreCase) ? str2.TrimEnd('4', '1') : str2;
Console.WriteLine(str2);
Console.WriteLine(new string(
  str
    .SkipWhile(c=>c=='4')
    .SkipWhile(c=>c=='1')
    .Reverse()
    .SkipWhile(c=>c=='1')
    .SkipWhile(c=>c=='4')
    .Reverse()
    .ToArray()
));


- какой именно способ интересует?
Ну апотом - да, как опять же было сказано выше, компилируете нужный способ на C#, смотрите результат ILDASM'ом.
...
Рейтинг: 0 / 0
IL-программка
    #39625515
Ginko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо!

В принципе такой код подходит
Код: c#
1.
2.
3.
4.
            var str = "418256419256841";
            str = str.Substring(str.StartsWith("41", StringComparison.OrdinalIgnoreCase) ? 2 : 0);
            str = str.Substring(0, str.EndsWith("41", StringComparison.OrdinalIgnoreCase) ? str.Length - 2 : str.Length);
            Console.WriteLine(str);



но IL код слишком здоровый получается
Код: plsql
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.
0	0000	ldstr	"418256419256841"
1	0005	stloc.0
2	0006	ldloc.0
3	0007	ldloc.0
4	0008	ldstr	"41"
5	000D	ldc.i4.5
6	000E	callvirt	instance bool [mscorlib]System.String::StartsWith(string, valuetype [mscorlib]System.StringComparison)
7	0013	brtrue.s	10 (0018) ldc.i4.2 
8	0015	ldc.i4.0
9	0016	br.s	11 (0019) callvirt instance string [mscorlib]System.String::Substring(int32)
10	0018	ldc.i4.2
11	0019	callvirt	instance string [mscorlib]System.String::Substring(int32)
12	001E	stloc.0
13	001F	ldloc.0
14	0020	ldc.i4.0
15	0021	ldloc.0
16	0022	ldstr	"41"
17	0027	ldc.i4.5
18	0028	callvirt	instance bool [mscorlib]System.String::EndsWith(string, valuetype [mscorlib]System.StringComparison)
19	002D	brtrue.s	23 (0037) ldloc.0 
20	002F	ldloc.0
21	0030	callvirt	instance int32 [mscorlib]System.String::get_Length()
22	0035	br.s	27 (003F) callvirt instance string [mscorlib]System.String::Substring(int32, int32)
23	0037	ldloc.0
24	0038	callvirt	instance int32 [mscorlib]System.String::get_Length()
25	003D	ldc.i4.2
26	003E	sub
27	003F	callvirt	instance string [mscorlib]System.String::Substring(int32, int32)
28	0044	stloc.0
29	0045	ldloc.0
30	0046	call	void [mscorlib]System.Console::WriteLine(string)
31	004B	ret



рассчитывал на что-то более компактное, если честно...
...
Рейтинг: 0 / 0
IL-программка
    #39625541
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ginkoно IL код слишком здоровый получается
рассчитывал на что-то более компактное, если честно...
Там еще вариант с регэкспом есть:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
  IL_0001:  ldstr      "4182569841"
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  ldstr      "^41|41$"
  IL_000d:  ldsfld     string [mscorlib]System.String::Empty
  IL_0012:  call       string [System]System.Text.RegularExpressions.Regex::Replace(string, string, string)
  IL_0017:  stloc.1
  IL_0018:  ldloc.1


- вроде бы вполне компактно.
...
Рейтинг: 0 / 0
IL-программка
    #39625547
Ginko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здорово! Огромное Спасибо!
(мне поначалу строчка с Regex была не понятна)
...
Рейтинг: 0 / 0
IL-программка
    #39625559
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хороший повод разобраться с "Регулярными выражениями"
...
Рейтинг: 0 / 0
IL-программка
    #39625625
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ginkoрассчитывал на что-то более компактное, если честно...

Код: c#
1.
IL_0012:  call       string [System]System.Text.RegularExpressions.Regex::Replace(string, string, string)



Хорошо, что вот этот метод не дизассемблировался )))
...
Рейтинг: 0 / 0
IL-программка
    #39626204
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesхороший повод разобраться с "Регулярными выражениями"

+ и с IL?

даладно, и так хорошо
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / IL-программка
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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