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

Подскажите в IL-кодах, как определить и удалить нежелательную подстроку "41" в начале и в конце строки.
...
Рейтинг: 0 / 0
04.04.2018, 05:32
    #39625294
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IL-программка
Ginko, пишешь консольную программу "41text41".Replace("41",string.Empty), компилируешь, дизассемблируешь с помощью ILDasm.exe, смотришь
...
Рейтинг: 0 / 0
04.04.2018, 07:02
    #39625301
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IL-программка
Эту операцию можно сделать энным количеством разных способов - начиная от вышеупомянутого 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
04.04.2018, 14:03
    #39625515
Ginko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IL-программка
Спасибо!

В принципе такой код подходит
Код: 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
04.04.2018, 14:42
    #39625541
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IL-программка
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
04.04.2018, 14:55
    #39625547
Ginko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IL-программка
Здорово! Огромное Спасибо!
(мне поначалу строчка с Regex была не понятна)
...
Рейтинг: 0 / 0
04.04.2018, 15:08
    #39625559
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IL-программка
хороший повод разобраться с "Регулярными выражениями"
...
Рейтинг: 0 / 0
04.04.2018, 16:32
    #39625625
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IL-программка
Ginkoрассчитывал на что-то более компактное, если честно...

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



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

+ и с IL?

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


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