我有一个从 argv[1] 获取输入的程序,所以我像这样运行它
./myProgram Hello
但是我需要输入十六进制而不是十进制/文本,比如
./myProgram \x48\x65\x6c\x6c\x6f
但程序将其作为文本而不是构成单词 Hello 的十六进制。
我不能
python -c "print '\x48\x65\x6c\x6c\x6f'" | ./myProgram
因为程序把里面的数据作为argv[1]
我该如何解决这个问题? (我不能修改程序)
最佳答案
继续评论,由于不知道 ./myProgram
中的确切内容,因此有点难以猜测,但根据您报告的内容,有几项合乎逻辑的尝试。
正如您所指出的,您需要将十六进制输入作为 ./myProgram
的第一个参数,而不是将其传递给 stdin
上的程序。您正确地注意到 python -c "print '\x48\x65\x6c\x6c\x6f'"| ./myProgram
由于这个原因而失败。如您所知,管道 到程序会将初始进程的stdout
重定向到后续进程的stdin
,而不是作为它的参数。
这就是进程替换 可以提供帮助的地方。在 $(...)
(或 backticks '...'
中的旧格式)中放置进程时,程序返回。因此,您可以通过以下方式提供 python -c "print '\x48\x65\x6c\x6c\x6f'"
的输出作为参数:
./myProgram $(python -c "print '\x48\x65\x6c\x6c\x6f'")
最后,如果 myProgram
只是在寻找字符串格式的十六进制输入,那么就没有理由进行多次转义。简单地提供十六进制数的字符串表示可能就足够了。类似于以下内容:
./myProgram 0x48656c6c6f
我很高兴其中一个建议是您需要的“银弹”。祝你使用 shell 好运。如果您有任何其他问题,请告诉我们。
关于c - 将十六进制输入 argv[1],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43084894/