为什么通过命令行参数传递时字符串中的十六进制不会转换为十六进制?

时间:2010-09-03 13:42:08

标签: c string hex argv

据我所知,可以使用\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]中的值是否可以转换为十六进制数字(不进行解析,如第一个示例中所做的那样)?

感谢您的时间。

6 个答案:

答案 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来处理它。