如何从十六进制转为十进制

How to escape from hex to decimal

如果这是一个明显的问题,我深表歉意。我一直在网上搜索这个问题的答案,但找不到。这与我的代码本身无关,这是我的好奇心。

我正在测试我的函数以读取缓冲区的开始和结束字节。

如果我将一个字符数组声明为:

char *buffer;
buffer = "\x0212\x03";

意思是STX12ETX - 在十六进制和十进制之间切换。

我得到预期的错误:

warning: hex escape sequence out of range [enabled by default]

我可以使用所有十六进制值测试代码:

"\x02\x31\x32\x03"

我想知道,有没有办法将十六进制值转义,表示后面是十进制值?

这样的事情对你有用吗?

char *buffer;

buffer = "\x02" "12" "\x03";

根据标准:

§ 5.1.1.2 6. Adjacent string literal tokens are concatenated.

§ 6.4.4.4 3. and 7. Each octal or hexadecimal escape sequence is the longest sequence of characters that can constitute the escape sequence.

  • 转义字符:

  • \' - 单引号 '

  • \" - 双引号 "
  • \? - 问号 ?
  • \ - 反斜杠 \
  • \八进制数字
  • \x十六进制数字

所以唯一的方法是使用预编译器连接来连接字符串(一个接一个地列出它们)。

如果您想了解更多编译器如何构造文字,请查看 §6.4.4.4 和 §6.4.5,它们分别描述了如何构造字符文字和字符串文字。

你可以写

"\b12"

表示十进制值。尽管您需要在十六进制值后使用 space 才能正常工作。

buffer = "\x02 \b12\x03";

或者只有 12

buffer = "\x02 12\x03";

基本上你需要在你的十六进制值后添加一个空白字符来表明它是一个新值而不是同一个值

不,没有办法结束十六进制转义,除非有一个无效的(对于十六进制值)字符,但是那个字符当然会被解释为它自己的权利。

C11 草案说(在 6.4.4.4 14):

[...] a hexadecimal escape sequence is terminated only by a non-hexadecimal character.

八进制转义没有这个问题,它们被限制为三个八进制数字。

您始终可以使用八进制格式。八进制代码始终为 3 位。 因此,要获得字符 '<-',只需键入 \215