我有从设备收到的原始二进制数据。我想显示像HEX编辑器那样的数据 - 显示十六进制值,但也显示相应的字符。
我发现字体中包含ASCII代码为0 - 32的字符,但我无法将它们显示在屏幕上。
我尝试使用WPF listbox,itemscontrol和textbox。
是否有一些设置可以使这项工作?
或者也许某些WPF控件会显示这些字符?
修改
经过一些思考和测试后,只有出现问题的字符是换行,换页,回车,退格,水平和垂直制表符。作为快速解决方案,我决定用ASCII 16(10HEX)字符替换这些字符。我用ASCII,UTF-8和Unicode文件测试了它,它适用于这三种格式。
这是我正在使用的正则表达式:
rawLine = Regex.Replace(inputLine, "[\t\n\r\f\b\v]", '\x0010'.ToString());
它用一些四四方位的符号替换了这6个有问题的字符的所有出现。它表明这不是“常规可打印”字符,它对我有用。
答案 0 :(得分:3)
不确定这是否是您想要的,但我建议您查看#develop项目。他们的编辑器可以显示空格,制表符和行尾标记。
我快速浏览了源代码,在ICSharpCode.AvalonEdit.Rendering
类SingleCharacterElementGenerator
类中,似乎做了你想做的事。
答案 1 :(得分:0)
这应该可以帮助您扩展它
private static string GetPrintableCharacter(char character)
{
switch (character)
{
case '\a':
{
return "\\a";
}
case '\b':
{
return "\\b";
}
case '\t':
{
return "\\t";
}
case '\n':
{
return "\\n";
}
case '\v':
{
return "\\v";
}
case '\f':
{
return "\\f";
}
case '\r':
{
return "\\r";
}
default:
{
if (character == ' ')
{
break;
}
else
{
throw new InvalidArgumentException(Resources.NOTSUPPORTCHAR, new object[] { character });
}
}
}
return "\\x20";
}
public static string GetPrintableText(string text)
{
StringBuilder stringBuilder = new StringBuilder(1024);
if (text == null)
{
return "[~NULL~]";
}
if (text.Length == 0)
{
return "[~EMPTY~]";
}
stringBuilder.Remove(0, stringBuilder.Length);
int num = 0;
for (int i = 0; i < text.Length; i++)
{
if (text[i] == '\a' || text[i] == '\b' || text[i] == '\f' || text[i] == '\v' || text[i] == '\t' || text[i] == '\n' || text[i] == '\r' || text[i] == ' ')
{
num += 3;
}
}
int length = text.Length + num;
if (stringBuilder.Capacity < length)
{
stringBuilder = new StringBuilder(length);
}
string str = text;
for (int j = 0; j < str.Length; j++)
{
char chr = str[j];
if (chr > ' ')
{
stringBuilder.Append(chr);
}
else
{
stringBuilder.Append(StringHelper.GetPrintableCharacter(chr));
}
}
return stringBuilder.ToString();
}