我有一个字符串"SOMETHING /\xff"
,我想将0xff
的十六进制表示保存到一个char
缓冲区中。所以我strncpy
正斜杠(/
)后的所有内容放入我的缓冲区(我们称之为buff
)。在C字符串中存储十六进制值?
但是,当我使用gdb命令print \x buff
来查看buff
的内容时,它不显示0xff
。任何想法可能是错误的?我的前锋可能会搞砸了吗?
我有一个字符串"SOMETHING /\xff"
,我想将0xff
的十六进制表示保存到一个char
缓冲区中。所以我strncpy
正斜杠(/
)后的所有内容放入我的缓冲区(我们称之为buff
)。在C字符串中存储十六进制值?
但是,当我使用gdb命令print \x buff
来查看buff
的内容时,它不显示0xff
。任何想法可能是错误的?我的前锋可能会搞砸了吗?
我认为你的问题与你在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可以看到arr
是char[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
秒的数组的第一个元素,并允许你使用打印命令。
请记住,C中的字符串是一个char
值的数组。而char
是一个无符号的8位数量。 (就像int
是一个带符号的16位数量一样。)可以放在无符号8位字段中的最大值是255十进制,它是0xFF十六进制或0377八进制或11111111二进制。
在C中带引号的字符串中,符号\xNN
表示插入十六进制值为NN的字符。
-1;标准中没有任何内容说'char'是无符号的,标准中没有任何内容说它必须是8位,或者'int'必须是16位。实际上,在大多数编译器中,“int”是32位。 – 2014-06-29 21:12:14
0xFF不是可打印的ASCII字符,所以gdb无法打印它。
这还不清楚。正如你在前面的问题的答案中已经解释的那样,'\ xff'并不是真正存储在字符串中的。单个字符(其值为255)存储在其位置。 – 2012-04-07 22:24:53
正斜杠不应该影响以下字符。什么_does_ gdb在缓冲区中显示? – 2012-04-07 22:25:17
你有任何代码去与该段? – DavidO 2012-04-07 22:25:32