2012-04-07 47 views
2

我有一个字符串"SOMETHING /\xff",我想将0xff的十六进制表示保存到一个char缓冲区中。所以我strncpy正斜杠(/)后的所有内容放入我的缓冲区(我们称之为buff)。在C字符串中存储十六进制值?

但是,当我使用gdb命令print \x buff来查看buff的内容时,它不显示0xff。任何想法可能是错误的?我的前锋可能会搞砸了吗?

+0

这还不清楚。正如你在前面的问题的答案中已经解释的那样,'\ xff'并不是真正存储在字符串中的。单个字符(其值为255)存储在其位置。 – 2012-04-07 22:24:53

+1

正斜杠不应该影响以下字符。什么_does_ gdb在缓冲区中显示? – 2012-04-07 22:25:17

+1

你有任何代码去与该段? – DavidO 2012-04-07 22:25:32

回答

3

我认为你的问题与你在gdb中打印变量的方式有关。就拿这个简单的程序,(如果使用gcc -g)编译为调试和运行,并在第一puts声明打破:

int main(void) 
{ 
    char *ptr = "str \xff"; 
    char arr[] = "str \xff"; 
    puts(ptr); 
    puts(arr); 

    return 0; 
} 

如果我尝试打印ptr你所提到的方式,p /x ptr,它会打印ptr值(它指向的地址):

(gdb) p /x ptr 
$1 = 0x4005f8 

但是如果我为arr做同样的命令,我会得到:

(gdb) p /x arr 
$2 = {0x73, 0x74, 0x72, 0x20, 0xff, 0x0} 

这是因为gdb可以看到arrchar[6]而不是char*。你可以用命令p /x "str \xff",这对于测试的东西是很有用的相同的结果:

(gdb) p /x "str \xff" 
$3 = {0x73, 0x74, 0x72, 0x20, 0xff, 0x0} 


现在,如果你想成为能够打印一定量的字节从地址的指向一个指针,使用检查(x)存储器命令而不是打印(p)的:

(gdb) x/6bx ptr 
0x4005f8 <__dso_handle+8>: 0x73 0x74 0x72 0x20 0xff 0x00 

那将在十六进制打印6个字节的地址所指向的ptr。试着用你的buff变量来看看你是如何去的。


或者,你可以尝试其他的事情是:

(gdb) p /x (char[6])*ptr 
$4 = {0x73, 0x74, 0x72, 0x20, 0xff, 0x0} 

这将把char指向ptr如在6 char秒的数组的第一个元素,并允许你使用打印命令。

-2

请记住,C中的字符串是一个char值的数组。而char是一个无符号的8位数量。 (就像int是一个带符号的16位数量一样。)可以放在无符号8位字段中的最大值是255十进制,它是0xFF十六进制或0377八进制或11111111二进制。

在C中带引号的字符串中,符号\xNN表示插入十六进制值为NN的字符。

+1

-1;标准中没有任何内容说'char'是无符号的,标准中没有任何内容说它必须是8位,或者'int'必须是16位。实际上,在大多数编译器中,“int”是32位。 – 2014-06-29 21:12:14

0

0xFF不是可打印的ASCII字符,所以gdb无法打印它。

相关问题