代码之家  ›  专栏  ›  技术社区  ›  Andrew-Dufresne

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

  •  4
  • Andrew-Dufresne  · 技术社区  · 16 年前

    我的理解是十六进制数字可以用 \x 0x41 0x42 可以放在字符串中作为 "\x41\x42" .

    char * ptr = "\x41\x42" ;
    printf( "%s\n" , ptr ) // AB
    

    \十 被丢弃 41

    但是如果我通过命令行参数将它传递给我的程序,它就不起作用了。

        // test.c
        main( int argc , char * argv[] ) 
        {
           printf( "%s\n" , argv[1] ) ;
        }
    


    $./prog“\x41\x42”

    $.prog\x41\x42美元
    \x41\x42型

    我所期望的是 AB
    为什么会这样?为什么这种表示方法在命令行参数的情况下不起作用?
    如何才能在 argv[1] 我们可以肯定的是,十六进制字符串可以转换成十六进制数(无需解析,就像第一个示例中所做的那样)?

    谢谢你的时间。

    6 回复  |  直到 16 年前
        1
  •  2
  •   DmitryK    16 年前

    \x41是值为41(十六进制)的字节的内部C表示。当你编译这个程序时,它的二进制格式是41h(只有1个字节-不是\x41)。 当您从命令行传递\x41时,它将被视为一个由4个字符组成的字符串,因此您可以看到所看到的内容。

        2
  •  5
  •   BarsMonster    16 年前

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

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

        3
  •  4
  •   Rakholiya Jenish    11 年前

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

    这和

    ./prog "AAA"
    
        4
  •  1
  •   Khaled Alshaya    16 年前

        5
  •  1
  •   Stephen Doyle    16 年前

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

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

        6
  •  0
  •   Jerry Coffin    16 年前

    既然已经告诉你为什么它不起作用,也许你想知道如何使它起作用。碰巧几年前我也有同样的想法 some code 去处理它。