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

时间:2015-05-08 12:53:54

标签: c hex escaping decimal

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

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

如果我将char数组声明为:

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

表示STX12ETX - 在十六进制和十进制之间切换。

我收到了预期的错误:

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

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

"\x02\x31\x32\x03"

我想知道,是否有办法转义十六进制值以指示以下是十进制值?

4 个答案:

答案 0 :(得分:5)

会是这样的吗?

char *buffer;

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

根据标准:

  

§5.1.1.26.连接相邻的字符串文字标记。

     

§6.4.4.43.和7.每个八进制或十六进制转义序列是可以构成转义序列的最长字符序列。

  • 转义字符:

  • \' - 单引号'

  • \“ - 双引号”
  • \? - 问号?
  • \ - backslash \
  • \ octal digits
  • \ xhexadecimal digits

所以唯一的方法就是将字符串与预编译器连接串联起来(一个接一个地列出它们)。

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

答案 1 :(得分:1)

你可以写

"\b12"

表示小数值。你需要在十六进制值之后使用空格才能工作。

buffer = "\x02 \b12\x03";

或者只是12

buffer = "\x02 12\x03";

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

答案 2 :(得分:1)

不,除非有一个无效的(对于十六进制值)字符,否则无法结束十六进制转义,但当然这个字符本身就被解释了。

C11草案(见6.4.4.4 14):

  

[...]十六进制转义序列仅以非十六进制字符终止。

Octal逃避没有这个问题,他们被限制在三位八位数。

答案 3 :(得分:1)

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