2

我有一个字符串"SOMETHING /\xff",我想将 的十六进制表示保存0xffchar缓冲区中。因此,我strncpy将正斜杠 ( /) 之后的所有内容都放入我的缓冲区(我们称之为buff)。

但是,当我使用 gdb 命令print \x buff查看 的内容时buff,它不显示0xff. 关于什么可能是错的任何想法?我的正斜杠有可能把事情搞砸了吗?

4

3 回答 3

5

我认为您的问题与您在 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 arris 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 命令。

于 2012-04-07T22:54:56.687 回答
0

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

于 2015-04-05T00:13:11.080 回答
-2

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

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

于 2012-04-07T22:32:58.363 回答