C# 构建十六进制表示法字符串

问题描述 投票:0回答:4

如何以十六进制表示法构建转义序列字符串。

示例:

string s = "\x1A"; // this will create the hex-value 1A or dec-value 26

我希望能够像这样构建十六进制值在 00 到 FF 之间的字符串(在本例中为 1B)

string s = "\x" + "1B"; // Unrecognized escape sequence

也许还有另一种制作十六进制字符串的方法...

c# string hex
4个回答
44
投票

请尽量避免使用

\x
转义序列。它很难阅读,因为它停止的位置取决于数据。例如,这两个字符串乍一看有多大区别?

"\x9Good compiler"
"\x9Bad compiler"

在前者中,“\x9”是制表符 - 转义序列在那里停止,因为“G”不是有效的十六进制字符。在第二个字符串中,“\x9Bad”都是转义序列,留下一些随机的 Unicode 字符和“编译器”。

我建议你使用 \u 转义序列来代替:

"\u0009Good compiler"
"\u0009Bad compiler"

(当然,对于选项卡,您可以使用

\t
,但我希望您明白我的意思......)

这当然有点偏离最初的问题,但已经得到了回答:)


23
投票

您不在字符串中存储十六进制值。

你可以,但它只是一个字符串,并且必须转换为整数或字节才能实际读取其值。

您可以将十六进制值作为文字分配给 int 或 byte:

Byte value = 0x0FF;
int value = 0x1B;

因此,可以轻松地将十六进制文字传递到字符串中:

string foo = String.Format("{0} hex test", 0x0BB);

这将创建这个字符串“126 hex test”。

但我认为这不是你想要的?


5
投票

十六进制16位unicode字符代码有一个'\u'转义码。

Console.WriteLine( "Look, I'm so happy : \u263A" );

0
投票

接受的答案包含以下声明:

您不在字符串中存储十六进制值。

通常这是真的。
适合将奇怪的“通常不可打印”字符存储在字符串中的问题范围相当小。但工作技能“整合”似乎正在上升,这是你可能想做OP建议的地方。 如果您正在处理文件,您可能会发现数据中存在需要忽略的自定义字符集。 在这种情况下,在字符串中存储不可打印的字符(制表符、转义符等)可能是一种可行的方法。

我将这些“忽略的字符”称为

空白
,尽管本示例中的一些字符是可打印的,并且术语空白通常仅指不可打印的字符。 这样写比较容易。
例如,您可能要求以下

空白:

空格(0x32)、制表符(或0x9)、不间断空格(0xA0)、下划线(_)和破折号(-)
  • 但这些不是
空白:

新行、m-dash 和 n-dash

  • 空白的定义将阻止您使用内置的 C# 函数。
  • 它还将阻止使用包含字符串函数的大多数常见库(例如
Extensions.cs

)。
readonly string whiteSpace = "\u0032\t\u00A0_-";

在此示例中,您可以对前面的字符串使用 Contains 来检测哪些字符是空格(使用上面给出的定义或任何其他自定义定义)。

如果用户/业务分析师有在开发期间和/或发布前不久更改需求的历史,那么将这些特殊字符加载到字符串中是一个特别好的选择。
(字符串很容易更改,并且需要对其他系统进行最少的重新测试)


我无权向已接受的答案添加评论,我猜是因为它的年龄。鉴于出现的“集成”工作数量不断增加,这个问题和这个答案所提出的观点都与当今的许多开发人员相关(在提出这个问题 15 年后)。


© www.soinside.com 2019 - 2024. All rights reserved.