据我所知,可以使用\x
将十六进制数字放入字符串中。例如,0x41 0x42
可以作为"\x41\x42"
放在字符串中。
char * ptr = "\x41\x42" ;
printf( "%s\n" , ptr ) // AB
\x
被丢弃,编译器将41
视为十六进制。
但是如果我通过命令行参数将它传递给我的程序,它就不起作用。
// test.c
main( int argc , char * argv[] )
{
printf( "%s\n" , argv[1] ) ;
}
$ gcc -o prog test.c
$ ./prog“\ x41 \ x42”
\ X41 \ X42
$ .prog \ x41 \ x42
\ X41 \ X42
我所期望的是AB
,如示例1中所示
为什么会这样?为什么这种表示方法在命令行参数的情况下不起作用?
我们知道的argv[1]
中的值是否可以转换为十六进制数字(不进行解析,如第一个示例中所做的那样)?
感谢您的时间。
答案 0 :(得分:5)
它在源代码中工作,因为编译器(预处理器)进行替换。 当你的程序在黑暗中单独工作时,没有编译器可以帮助进行那种替换。
所以,如果你需要像编译器那样解析它 - 自己动手。
答案 1 :(得分:4)
如果您按以下方式调用程序,它将起作用:
./prog $'\x41\x41\x41'
与
相同./prog "AAA"
答案 2 :(得分:2)
\ x41是一个字节的内部C表示,其值为41(十六进制)。当你编译这个程序然后在二进制文件中它将是41h(只有1个字节 - 不是\ x41)。 当您从命令行传递\ x41时,它将被视为一个包含4个字符的字符串,因此您可以看到所看到的内容。
答案 3 :(得分:1)
它不起作用,因为在第二种情况下编译器不存在以分析字符串。即,这仅适用于代码中的字符串文字。
答案 4 :(得分:1)
使用\ x方法时,编译器在生成字符串文字时执行实际转换。当您通过命令行传入此内容时,不会发生此类转换,因为不涉及编译器。
您需要编写一些代码才能进行转换。
答案 5 :(得分:0)
既然你已经被告知为什么它不起作用,也许你想知道如何让它发挥作用。碰巧我几年前就有同样的想法,写了some code来处理它。