.NET用hex代码的字符串表示替换不可打印的ASCII

我有一个字符串,其中包含一些不可打印的ascii字符,如:

"ABCD\x09\x05\r\n" 

我想用hex代码编号的ascii字符串表示替换这些字符,所以我得到这样的东西:

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

什么是最好的方法呢? 可以使用正则表达式吗?

模式\p{Cc}匹配任何控制字符,所以

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

也会取代控制字符。

 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(); 

对不起,没有编译器方便,但我认为这编译并完成工作。

此外,这种类型的字符串遍历两次(一次将每个字符投影到hex替换或字符串,然后再次聚合),并且可以通过将投影集中到对Enumerable.Aggregate的调用来避免这种情况,但这是更清楚,除非这对性能至关重要,否则可能并不重要。

灵感来自杰森的例子,但有点简单。 我不确定哪个表现更好,而且现在没有时间对它进行基准测试,但它应该只需一次通过即可:

 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())); 

我已经测试了这个function。