4

据我所知,十六进制数字可以使用\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]

谢谢你的时间。

4

6 回答 6

5

它确实在源代码中工作,因为编译器(预处理器)进行了替换。当您的程序在黑暗中单独工作时,没有编译器可以帮助进行这种替换。

所以,如果你需要像编译器那样解析它 - 自己做。

于 2010-09-03T13:45:24.697 回答
4

如果您按以下方式调用程序,它将起作用:

./prog $'\x41\x41\x41' 

这与

./prog "AAA"
于 2013-04-08T17:30:14.783 回答
2

\x41 is an internal C representation of a byte with a value of 41 (hex). When you compile this program then in the binary it WILL be 41h (just 1 byte - not \x41). When you pass \x41 from a command line it will be treated just as a string of 4 chars hence you see what you see.

于 2010-09-03T13:47:43.450 回答
1

它不起作用,因为编译器在第二种情况下不存在来分析字符串。即这仅适用于代码中的字符串文字。

于 2010-09-03T13:46:19.613 回答
1

使用 \x 方法时,编译器会在生成字符串文字时进行实际转换。当您通过命令行传入时,不会发生这种转换,因为不涉及编译器。

您将需要编写一些代码来进行转换。

于 2010-09-03T13:46:40.307 回答
0

既然您已经被告知为什么它不起作用,也许您想知道如何使它起作用。碰巧几年前我也有同样的想法,并编写了一些代码来处理它。

于 2010-09-03T15:27:22.377 回答