我有一个字符串"SOMETHING /\xff"
,我想将0xff
的十六进制表示保存到char
缓冲区中。所以我strncpy
在正斜杠(/
)之后的所有内容都进入我的缓冲区(让我们称之为buff
)。
但是,当我使用gdb命令print \x buff
查看buff
的内容时,它不会显示0xff
。关于什么可能是错的任何想法?我的正斜线是否可能搞砸了?
答案 0 :(得分:3)
我认为你的问题与你在gdb中打印变量的方式有关。拿这个简单的程序,编译为debug(-g
如果使用gcc),并在第一个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}
现在,如果您希望能够从指针指向的地址打印一定数量的字节,请使用examine(x
)memory命令而不是print(p
):< / p>
(gdb) x/6bx ptr
0x4005f8 <__dso_handle+8>: 0x73 0x74 0x72 0x20 0xff 0x00
这将从ptr
指向的地址以十六进制格式打印6个字节。尝试使用buff
变量,看看你如何去做。
或者,您可以尝试的另一件事是:
(gdb) p /x (char[6])*ptr
$4 = {0x73, 0x74, 0x72, 0x20, 0xff, 0x0}
这会将char
指向的ptr
视为6 char
数组中的第一个元素,并允许您使用print命令。
答案 1 :(得分:0)
0xFF不是可打印的ASCII字符,因此gdb无法打印它。
答案 2 :(得分:-2)
请记住,C中的字符串是char
值的数组。而char
是无符号的8位数。 (正如int
是带符号的16位数。)可以放在无符号8位字段中的最大值是255十进制,即0xFF十六进制或0377八进制或11111111二进制。
在C中的带引号的字符串中,符号\xNN
表示插入十六进制值为NN的字符。