我有一个从argv [1]获取输入的程序,所以我像
一样运行它./myProgram Hello
但我需要输入十六进制而不是十进制/文本,所以像
./myProgram \x48\x65\x6c\x6c\x6f
但是程序将其作为文本而不是形成单词Hello的十六进制文件。
我不能
python -c "print '\x48\x65\x6c\x6c\x6f'" | ./myProgram
因为程序以argv [1]
的形式获取数据我该如何解决这个问题? (我无法修改程序)
答案 0 :(得分:0)
假设您正在撰写程序,因为帖子已标记为c
。
1)命令行参数格式如下:
./myProgram 0x55 0xAA 0xBB ...
甚至
./myProgram 55 66 AA BB ...
2)在你的程序中,所有输入参数都可以通过argv数组作为字符串获得。您可以使用格式为sscanf
的{{1}}从中读取十六进制值,并将它们存储到无符号整数变量中。此外,在最简单的情况下,它看起来类似于:
%X
答案 1 :(得分: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
我很高兴其中一个建议是"银弹"你需要。祝你的shell好运。如果您有任何其他问题,请告诉我们。
答案 2 :(得分:0)
只要输入字符串不包含空格,David Rankin的方法就可以很好地工作。空格将导致输入分为两个参数。正常情况下,为避免这种情况,将字符串用双引号引起来,但这会阻止python执行。我通过创建可以引用的中间变量来解决此问题:
foo=$(echo -e "\001 Hi!")
myProgram "$foo"