Почему шестнадцатеричный в строке не преобразуется в шестнадцатеричный при передаче через аргумент командной строки? - PullRequest
4 голосов
/ 03 сентября 2010

Что я понимаю, что шестнадцатеричные числа могут быть помещены в строку, используя \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 ]

5 голосов
/ 03 сентября 2010

Это работает в исходном коде, потому что компилятор (препроцессор) выполняет замену. Когда ваша программа работает одна в темноте, не существует компилятора, который бы мог помочь в такой замене.

Итак, если вам нужно разобрать то, что делает компилятор - сделайте это сами.

4 голосов
/ 08 апреля 2013

Это будет работать, если вы вызываете вашу программу следующим образом:

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

, что совпадает с

./prog "AAA"
2 голосов
/ 03 сентября 2010

\ x41 - это внутреннее представление C байта со значением 41 (шестнадцатеричное).Когда вы компилируете эту программу, то в двоичном файле она будет 41h (всего 1 байт - не \ x41).Когда вы передаете \ x41 из командной строки, он будет обрабатываться как строка из 4 символов, поэтому вы видите то, что видите.

1 голос
/ 03 сентября 2010

При использовании подхода \ x компилятор выполняет фактическое преобразование при генерации строковых литералов.Когда вы передаете это через командную строку, такое преобразование не происходит, поскольку компилятор не задействован.

Вам потребуется написать некоторый код для выполнения преобразования.

1 голос
/ 03 сентября 2010

Это не работает, потому что компилятор отсутствует во втором случае для анализа строки. это относится только к строковым литералам в вашем коде.

0 голосов
/ 03 сентября 2010

Теперь, когда вам сказали, почему это не работает, возможно, вы хотели бы получить представление о том, как заставить это работать. Как это случилось, у меня была такая же мысль несколько лет назад, и я написал некоторый код , чтобы справиться с этим.

...