我遇到了一些问题。为了做我正在尝试的事情,我需要能够将纯十六进制值输入到命令行的标准输入中(特别是在程序内部的gets()调用中)而不使用IO重定向。我通常使用ctrl + u + number来输入相当于输入的十六进制值的ascii字符,但是我需要能够输入null chars / backspaces / etc,终端要么忽略或解释为动作而不是字符。如果我使用管道或IO重定向,在初始输入和程序关闭后我无法与程序交互。有人会有任何想法吗?我想可能的解决方案是:
第三个我甚至不确定是可行的还是有用的,因为我不完全确定为什么程序不能正常工作如果它从命令行直接获取信息,我只知道我必须手动输入,否则它将无法运行。有没有人对这3个选项中的任何一个有任何想法,或者你能想到的任何其他选项?我很难过。
(哦,如果有人能解释为什么有时ctrl + u + number输出的字符与输入的数字完全不同的十六进制值,我很好奇,但我不认为它会帮助我当前的问题无论如何。)
答案 0 :(得分:1)
您可以在tty
(未烹饪)模式下切换raw
,然后将所有输入的字符传递给程序而不进行任何处理:
$ stty raw
$ command ...
$ stty -raw
键盘完全能够使用 Control @ 发送空00
字节,但是,无法使用{读取它{1}}看起来就像你使用的那样,确保你逐个字符处理字符串,而不是像gets
一样处理字符串,在后一种情况下作为终结符。
00
Control D 或 Control V Control <熟食模式下的/ kbd> D
04
是 Control E ,但可能会被您的终端模拟器截获,在这种情况下您必须禁用快捷方式或使用其他模拟器。
05
Control H 或 Control V Control <熟食模式下的/ kbd> H
08
只是 t
74
不是有效的UTF-8字符。您仍然可以将此字节传递给您的程序,例如:
84