.NET заменит непечатный ASCII строковым представлением шестнадцатеричного кода - PullRequest
12 голосов
/ 12 августа 2011

У меня есть строка с некоторыми непечатаемыми символами ascii, что-то вроде:

"ABCD\x09\x05\r\n"

Я хочу заменить эти символы на представление строки шестнадцатеричных кодов в ascii, так что я получаюкак это:

"ABCD[09][05][0D][0A]"

Какой лучший способ сделать это?Можно ли использовать регулярное выражение?

Ответы [ 3 ]

24 голосов
/ 12 августа 2011

Шаблон \p{Cc} соответствует любому управляющему символу, поэтому

Regex.Replace(input,
              @"\p{Cc}", 
              a=>string.Format("[{0:X2}]", (byte)a.Value[0])
            );

также заменит управляющие символы.

8 голосов
/ 12 августа 2011
string s = "ABCD\x09\x05\r\n";
var replace = 
    s.Select(c => Char.IsControl(c) ? ((int)c).ToString("X2") : c.ToString())
     .Aggregate(new StringBuilder(), (sb, t) => sb.Append(t))
     .ToString();

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

Кроме того, этот тип обходит строку дважды (один раз, чтобы проецировать каждый символ на шестнадцатеричную замену или строку, а затем снова для агрегирования), и вы можете избежать этого, объединив проекцию в вызов Enumerable.Aggregate, но это более понятно, и, вероятно, это не имеет большого значения, если только это не критично для производительности.

4 голосов
/ 27 сентября 2012

Вдохновленный примером Джейсона, но немного проще. Я не уверен, что работает лучше, и у меня нет времени, чтобы оценить его прямо сейчас, но он должен сделать все за один проход:

string s = "ABCD\x09\x05\r\n";
string replace = String.Concat(s.Select(c => Char.IsControl(c) ?
                                             String.Format("[{0:X2}]", (int)c) :
                                             c.ToString()));

Я проверял это на функциональность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...