在C字符串中存储十六进制值?

时间:2012-04-07 22:22:26

标签: c binary gdb hex

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

但是,当我使用gdb命令print \x buff查看buff的内容时,它不会显示0xff。关于什么可能是错的任何想法?我的正斜线是否可能搞砸了?

3 个答案:

答案 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的字符。