2017-03-29 114 views
0

我有一個程序,它從argv的輸入[1]所以我運行它像輸入十六進制到的argv [1]

./myProgram Hello 

但我需要輸入十六進制而不是十進制/文本所以像

./myProgram \x48\x65\x6c\x6c\x6f 

但程序將其作爲文本而不是形成單詞Hello的十六進制。

我不能

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

,因爲該方案需要在數據將以argv [1]

我該如何解決這個問題? (我無法修改程序)

+1

解析程序中的文本 – Jiahao

+4

您嘗試過'./myProgram 0x48656c6c6f'嗎? (這是很難猜測不知道'myProgram'是什麼。)另一種選擇,如果這是一個shell練習是'./myProgram $(python -c「print'\ x48 \ x65 \ x6c \ x6c \ x6f'「)' –

+0

Thanks @ DavidC.Rankin that works!不能將它設置爲接受的答案,雖然因爲它是一個評論........ – Friedpanseller

回答

0

假設您正在撰寫程序,因爲該帖子的標籤爲c

1)的命令行參數格式將是像以下:

./myProgram 0x55 0xAA 0xBB ... 
在程序

甚至

./myProgram 55 66 AA BB ... 

2)所有輸入參數將可經由argv數組爲字符串。您可以使用格式爲%Xsscanf從它們中讀取十六進制值並將它們存儲到無符號整數變量中。此外,在最簡單的情況下,將類似於:

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

從註釋繼續,不知道什麼是./myProgram使它有點難以猜測,但也有嘗試給你幾個順理成章之事報道。

正如您所指出的那樣,您需要將十六進制輸入作爲第一個參數傳遞給./myProgram,而不是將它傳遞給stdin上的程序。您正確地注意到python -c "print '\x48\x65\x6c\x6c\x6f'" | ./myProgram因爲這個原因失敗。如您所知,管道到程序重定向stdout的初始過程到stdin後續過程,而不是作爲它的一個參數。

那就是過程替換可以提供幫助。當在$(...)(或反斜槓'...'內的舊格式)中放置進程時,程序的輸出將被返回。因此,您可以通過提供的python -c "print '\x48\x65\x6c\x6c\x6f'"輸出作爲參數:

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

最後,如果myProgram簡直就是尋找字符串格式十六進制輸入,則沒有理由多個逃逸。只需提供十六進制數字的字符串表示就足夠了。像下面這樣:

./myProgram 0x48656c6c6f 

我很高興其中的一個建議是你所需要的「銀彈」。祝您的外殼使用順利。如果您還有其他問題,請告訴我們。