.NET将不可打印的ASCII替换为十六进制代码的字符串表示形式

本文关键字:代码 十六进制 字符串 表示 替换 打印 ASCII NET | 更新日期: 2023-09-27 18:05:12

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

"ABCD'x09'x05'r'n"

我想用十六进制代码的ascii字符串表示来替换这些字符,所以我得到了这样的东西:

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

做这件事最好的方法是什么?可以使用正则表达式吗?

.NET将不可打印的ASCII替换为十六进制代码的字符串表示形式

模式'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();

抱歉,手边没有编译器,但我认为这可以编译并完成任务。

此外,这种遍历字符串两次(一次将每个字符投影到十六进制替换或字符串,然后再次进行聚合(,您可以通过将投影集中到对Enumerable.Aggregate的调用中来避免这种情况,但这一点更清楚,除非这是性能关键,否则可能没有那么重要。

灵感来自Jason的例子,但有点简单。我不确定哪一个表现更好,现在也没有时间对其进行基准测试,但它应该一次完成所有工作:

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

我已经测试了它的功能。