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

在C字符串中存储十六进制值?,c,binary,gdb,hex,C,Binary,Gdb,Hex,我有一个字符串“SOMETHING/\xff”,我想将0xff的十六进制表示形式保存到char缓冲区中。因此,我strncpy将正斜杠(/)后面的所有内容放入缓冲区(我们称之为buff) 但是,当我使用gdb命令print\x buff查看buff的内容时,它不会显示0xff。有没有关于什么地方可能出错的想法?有没有可能我的正斜杠把事情搞砸了?请记住,C中的字符串是一个字符值数组。而char是一个无符号的8位量。(就像int是有符号的16位量一样。)无符号8位字段中的最大值为255位十进制,即0

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


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

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


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

我认为您的问题与在gdb中打印变量的方式有关。使用这个简单的程序,编译为debug(
-g
如果使用gcc),然后在第一个
put
语句处运行并中断:

int main(void)
{
   char *ptr = "str \xff";
   char arr[] = "str \xff";
   puts(ptr);
   puts(arr);

   return 0;
}
如果我尝试按您提到的方式打印
ptr
p/x ptr
,它将打印
ptr
的值(它指向的地址):

但是,如果我对
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
):


这将把
ptr
指向的
char
视为6个
char
数组中的第一个元素,并允许您使用print命令。

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

这不清楚。正如前面问题的答案中已经解释的那样,
\xff
不是字面上存储在字符串中的。单个字符(其值为255)存储在其位置。正斜杠不应影响以下字符。gdb在缓冲区中显示了什么?您是否有任何代码与该段落相匹配?您能否显示代码、您得到的内容以及您希望看到的内容?您试图存储什么?您希望字符串中包含
“0xff”
,还是希望值
FF
存储在缓冲区的一个字节中?-1;标准中没有规定
char
是无符号的,标准中也没有规定必须是8位或
int
必须是16位。事实上,在当今的大多数编译器中,
int
s是32位的。
(gdb) p /x "str \xff"
$3 = {0x73, 0x74, 0x72, 0x20, 0xff, 0x0}
(gdb) x/6bx ptr
0x4005f8 <__dso_handle+8>:  0x73    0x74    0x72    0x20    0xff    0x00
(gdb) p /x (char[6])*ptr
$4 = {0x73, 0x74, 0x72, 0x20, 0xff, 0x0}