Как разделить строку ANSI с неизвестными символами, возвращенными из OpenVMS в C#

У меня есть метод, который я написал на C#, который подключается к OpenVMS, запускает команду и затем возвращает результат.

Одна из выполняемых ею процедур DCL возвращает «форму» в виде строки, содержащей все виды кодировки ANSI.

Что я хочу сделать, так это разбить возвращаемую строку на массив на основе escape-символа ANSI в качестве разделителя, чтобы я мог дополнительно отсортировать его и позже построить отображение.

Проблема, с которой я сталкиваюсь, заключается в том, что escape-символ не выглядит так, как будто его распознают. Когда я проверяю строку в Visual Studio, я вижу стандартное форматирование ANSI со стрелкой, указывающей влево, которая выглядит следующим образом: ← между каждой записью. Это escape-символ.

Если я вставлю ту же строку в notepad++, она появится как ESC.

Я попытался разделить строку с разделителем \033, но это не сработало, я также пытался вставить символ ESC в переменную, но он просто вставляет пустое место.

Поэтому мне интересно, как мне узнать, какой код символа использует этот escape-символ, чтобы я мог использовать его в своем разделении.

Я бы опубликовал скриншот, но у меня нет представителя, чтобы сделать это, по-видимому.

редактировать: это то, что возвращается:

[02;27HDIVIDEND SETUP       11:25   Mon, 21 Jul 2014[04;05HCurrent attach point : VOD_TIM[07;05H   Code     Description[07;60HDate       Run

Он не отображается как символ в StackOverflow, но если вы представляете, что персонаж находится перед каждым из сегментов, начинающихся с [

Редактировать 2: Хорошо, мы установили, что код int char равен 27, поэтому теперь проблема заключается в том, как мне использовать это в моем разделении?


person Festivejelly    schedule 21.07.2014    source источник
comment
Не могли бы вы предоставить код для разделения?   -  person VMAtm    schedule 21.07.2014
comment
Можете ли вы опубликовать свой код? Как вы получаете эти строки - в виде массива байтов, в виде строки или как? И если вы можете определить, где находится проблемный персонаж, просто получите его номер, например Int32 charCode = (Int32)str[problemCharIndex], или сделайте то же самое в окне Watch во время отладки (Int32)str[problemCharIndex]   -  person Eugene Podskal    schedule 21.07.2014
comment
stackoverflow .com/questions/12370812/   -  person saj    schedule 21.07.2014
comment
Вывод возвращается в виде строки из Stream reader, который находится в пользовательской библиотеке SSH.NET. Я попробую ваш код, чтобы узнать, смогу ли я получить этот код символа.   -  person Festivejelly    schedule 21.07.2014
comment
Привет, Садж, я попробовал это, и у меня есть исключение.   -  person Festivejelly    schedule 21.07.2014
comment
Что int i = (int)str[0]; предоставляет в i?   -  person Thorsten Dittmar    schedule 21.07.2014
comment
ИЛИ int i = (int)'x'; должен вернуть код ASCII?   -  person saj    schedule 21.07.2014
comment
У вас также может быть проблема с ansi/Unicode. См. здесь   -  person Bob Vale    schedule 21.07.2014
comment
Оно возвращается как int 27, так что Торстен был прав!   -  person Festivejelly    schedule 21.07.2014


Ответы (1)


Вы можете попробовать разбить строку через Regex примерно так:

string input = YOUR_STRING_HERE;
string pattern = @"\033";

string[] substrings = Regex.Split(input, pattern);
foreach (string match in substrings)
{
   Console.WriteLine("'{0}'", match);
}

Обновление:

Вы можете использовать символ \e вместо символа ESC в Regex в .Net, см. полный список escape-символов в Regex здесь.

person VMAtm    schedule 21.07.2014
comment
Я думаю, вы должны удалить @ перед строкой шаблона. Иначе он будет искать буквенную последовательность \033 а не символ с кодом 033 или я ошибаюсь? - person Thorsten Dittmar; 21.07.2014
comment
@Thorsten Dittmar В документации @ сохраняется, но я не могу сказать наверняка. Я буду признателен, если вы можете предоставить дополнительную информацию об этом. - person VMAtm; 21.07.2014
comment
На самом деле игнорируйте то, что я сказал, это сработало! Я думаю, что знак @ имел значение! Спасибо ВМАтм! - person Festivejelly; 21.07.2014