输入十六进制到argv [1]

时间:2017-03-29 05:15:06

标签: c linux hex

我有一个从argv [1]获取输入的程序,所以我像

一样运行它
./myProgram Hello

但我需要输入十六进制而不是十进制/文本,所以像

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

但是程序将其作为文本而不是形成单词Hello的十六进制文件。

我不能

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

因为程序以argv [1]

的形式获取数据

我该如何解决这个问题? (我无法修改程序)

3 个答案:

答案 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"