在字符表示中打印特定的十六进制值

时间:2018-01-31 21:17:29

标签: c printf control-characters

当尝试在字符串中使用'\x05'时,编译的C代码在处理值时似乎表现得很奇怪。

例如,当使用以下字符串时:

char *weird = "\x04\x68\x65\x79\x79\x03\x6e\x65\x74\x05\x6c\x6f\x63\x61\x6c\x00";

打印字符串的每个字符时,'\x05'不对应于整数5,而'\x04''\x03'分别对应于整数4和3。

以下for循环演示了问题:

for(int i = 0; i < strlen(question); i++){
    printf("question[%d] = %c\n", i, question[i]);
}

输出:

0x05

为什么'\x05'这个具体案例如此麻烦?

3 个答案:

答案 0 :(得分:4)

%c格式说明符用于作为参数提供的相应整数值的可打印字符表示。根据ASCII编码,0x030x040x05都不是可打印的值!!

为了确认,您可以在尝试打印之前将相同的值传递给 isprint() 。如果你选择打印它,&#34;显示&#34;最终取决于您的终端如何选择解释显示。

这里有一些引用(12),其中列出了可打印和不可打印的ASCII值

答案 1 :(得分:3)

你的假设是错误的。 ASCII代码3,4和5 not 对应于(可见)整数345

您所看到的是您认为打算打印的本地终端翻译

  1. 它不会尝试解释代码34。这些对应于ASCII控制字符End of TextEnd of Transmission,但您的终端选择不处理它们。因此,它将这两个代码字面地写入输出流,它会查找合适的字体来显示它们。在现代(Unicode)字体中,这些字符没有字符,因为它们不是假定是&#34;打印&#34;。然而,一些终端意识到这一点,并提供一个后备,所以你至少可以看到一些东西。

  2. 另一方面,代码5 由您的终端解释:&#34;信号用于在接收端触发响应,以查看是否它仍然存在。&#34;终端发送该信号,接收(最有可能)a&#34;是&#34;回答 - 是的,输出流是活动的 - 并继续输出文本的其余部分。因为它是信号而不是字符,所以不显示任何内容。

  3. 此行为不是0x05代码的唯一行为。你没有在你的问题中提到它,但是当你打印&#34;打印时,你似乎并不惊讶。 \n&#39; 即使它也会向输出流发送代码0x0A。并且在屏幕上显示10但光标向下移动一行。同样,这是因为终端会解释代码以采取某些特定操作。

答案 2 :(得分:0)

完全没问题。 \x05在ASCII表格中不是可打印的字符,这就是为什么你会看到奇怪的字符。

%c期待可打印字符,而不是。

List of printable ASCII characters