我有一个字符串"SOMETHING /\xff"
,我想将 的十六进制表示保存0xff
到char
缓冲区中。因此,我strncpy
将正斜杠 ( /
) 之后的所有内容都放入我的缓冲区(我们称之为buff
)。
但是,当我使用 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 可以看到 that arr
is of typechar[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
指向的 byptr
视为 6 s 数组中的第一个元素char
,并允许您使用 print 命令。
0xFF 不是可打印的 ASCII 字符,所以 gdb 无法打印。
请记住,C 中的字符串是一个char
值数组。achar
是一个无符号的 8 位量。(就像 anint
是有符号的 16 位数量一样。)可以放置在无符号 8 位字段中的最大值是十进制的 255,即十六进制的 0xFF 或八进制的 0377 或二进制的 11111111。
在 C 中带引号的字符串中,表示法\xNN
表示插入十六进制值为 NN 的字符。