2017-03-29 15 views
0

私は、[1]私は入力Hexが[1]

./myProgram Hello 

のようにそれをARGVから入力を受け取り、プログラムを実行してきた。しかし、私が代わりに小数点/テキストの入力の十六進に必要

のようなので、何か
./myProgram \x48\x65\x6c\x6c\x6f 

しかし、このプログラムでは、単語Helloを構成する16進数の代わりにテキストとして取り込まれます。

私はできない

python -c "print '\x48\x65\x6c\x6c\x6f'" | ./myProgram 

プログラムはargvのようにデータを取るために、[1]

どのように私はこの問題を解決するのですか? (私はプログラムを変更できません)

+1

プログラム内のテキストを解析します。 – Jiahao

+4

'./myProgram 0x48656c6c6f'を試しましたか? ( 'myProgram'が何であるかを知らないと推測するのはむしろ難しいです。)これはシェルの演習であればもう一つのオプションは' ./myProgram $(python -c "p​​rint '\ x48 \ x65 \ x6c \ x6c \ x6f '")' –

+0

ありがとう@ DavidC.Rankin that works!それはコメントなので受け入れられた答えとして設定することはできません....... – Friedpanseller

答えて

0

投稿がcとタグ付けされているので、あなたはプログラムを書いているとしましょう。

1)コマンドラインパラメータの書式は次のようになります:

./myProgram 0x55 0xAA 0xBB ... 

あるいは

./myProgram 55 66 AA BB ... 

2)あなたのプログラム内のすべての入力パラメータは文字列としてargv配列を経由して利用できるようになります。 %Xという形式のsscanfを使用して、16進数値を読み込んで符号なし整数変数に格納することができます。また、それはのようになります。最も簡単な場合には:コメントに引き続き

unsigned int var; 
sscanf(argv[1], "%X", &var); // will read 0x55 
sscanf(argv[2], "%X", &var); // will read 0x66 and so on 
0

./myProgramにあった正確に何を知ることは推測することは少し困難になっていないが、しようとするには、いくつかの論理的な事柄は何を与えられたがあります報告。

指摘したように、プログラムにstdinを渡すのではなく、最初の引数として16進数の入力を./myProgramにする必要があります。そのため、python -c "print '\x48\x65\x6c\x6c\x6f'" | ./myProgramが失敗することに注意してください。ご存じのように、配管は、最初のプロセスのstdoutを、それ以降のプロセスのstdinにリダイレクトします。

これはプロセスの代替が役立つところです。 $(...)(または、バックチ内の古い形式'...')内にプロセスを配置すると、プログラムの出力が返されます。したがって、あなたがで引数としてpython -c "print '\x48\x65\x6c\x6c\x6f'"の出力を提供することができます:myProgramは、単に文字列形式で進数の入力を探している場合

./myProgram $(python -c "print '\x48\x65\x6c\x6c\x6f'") 

最後に、その後、複数のエスケープのための理由はありません。単純に16進数の文字列表現を提供するだけで十分です。次のようなものがあります:

./myProgram 0x48656c6c6f 

私は、あなたが必要としていた「銀色の弾丸」が嬉しいです。あなたのシェルを使って幸運を祈ってください。さらなるご質問がある場合はお知らせください。

関連する問題