在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}