4

を使用して16進数を文字列に配置できることを理解しています\x。たとえば、0x41 0x42として文字列に配置できます"\x41\x42"

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

\xは破棄41され、コンパイラーによって16進と見なされます。

しかし、コマンドライン引数を使用してプログラムに渡すと、機能しません。

    // 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のようなものでした。
なぜそうなのですか?コマンドライン引数の場合、なぜこの表現方法が機能しないのですか?16進文字列が16進数値に変換できることが確実にわかっている
値を(最初の例のように解析せずに)どのように変換できますか?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

文字列を分析するための2番目のケースにはコンパイラが存在しないため、機能しません。つまり、これはコード内の文字列リテラルにのみ適用されます。

于 2010-09-03T13:46:19.613 に答える
1

\ xアプローチを使用する場合、コンパイラは文字列リテラルを生成するときに実際の変換を行います。コマンドラインからこれを渡すと、コンパイラが関与しないため、このような変換は行われません。

変換を行うには、いくつかのコードを記述する必要があります。

于 2010-09-03T13:46:40.307 に答える
0

なぜそれが機能しないのかを説明されたので、おそらくそれを機能させる方法のアイデアが必要です。たまたま、私は数年前に同じ考えを持っていて、それに対処するためのコードを書きました。

于 2010-09-03T15:27:22.377 に答える