C 为什么字符串中的十六进制在通过命令行参数时不转换为十六进制?
据我所知,可以使用C 为什么字符串中的十六进制在通过命令行参数时不转换为十六进制?,c,string,hex,argv,C,String,Hex,Argv,据我所知,可以使用\x将十六进制数字放入字符串中。例如,0x41 0x42可以作为“\x41\x42”放置在字符串中 \x被丢弃,41被编译器视为十六进制 但如果我通过命令行参数将其传递给我的程序,它将不起作用 // test.c main( int argc , char * argv[] ) { printf( "%s\n" , argv[1] ) ; } $gcc-o prog test.c $./prog“\x41\x42” \x41\x
\x
将十六进制数字放入字符串中。例如,0x41 0x42
可以作为“\x41\x42”
放置在字符串中
\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]
中的值如何可以转换为十六进制数(无需解析,如第一个示例中所做的)
谢谢您的时间。它在源代码中可以工作,因为编译器(预处理器)进行替换。 当您的程序在黑暗中单独工作时,没有编译器来帮助您完成这种替换
因此,如果您需要像编译器那样解析该字符串,请自己动手。这不起作用,因为编译器在第二种情况下不存在,无法分析字符串。i、 e.这仅适用于代码中的字符串文字。使用\x方法时,编译器在生成字符串文字时进行实际转换。当您通过命令行传入时,不会发生这种转换,因为编译器不参与
您需要编写一些代码来进行转换。\x41是值为41(十六进制)的字节的内部C表示形式。当您编译这个程序时,它将是41h(只有1个字节-不是\x41)。
当您从命令行传递\x41时,它将被视为一个由4个字符组成的字符串,因此您可以看到所看到的内容。现在您已经知道了它为什么不起作用,也许您想知道如何使它起作用。碰巧几年前我也有同样的想法,于是我写了一封信来处理它。如果您用以下方式调用您的程序,它将起作用:
./prog $'\x41\x41\x41'
这和
./prog "AAA"
./prog "AAA"