使用showkey -s
我可以获得十六进制数字形式的按键扫描码。如何直接获取八进制数?
答案1
showkey
没有相应的开关,但您始终可以将输出传送到另一个程序来进行转换。
你zsh
可以这样做:
stdbuf -oL showkey -s | while read line
do
if [[ "$line" =~ '^0x' ]]
then
for code in ${(z)line}
do
printf "0%o " $code
done
echo
else
echo $line
fi
done
stdbuf
是的一部分GNU 核心工具并可用于修改标准流上的缓冲操作。用-oL
它调用调整标准输出进行行缓冲。必须这样做才能使 的输出showkey -s
立即逐行通过管道。否则,仅当缓冲区已满(通常为几 kB)或程序退出时才会传递输出。
输出通过管道传输到while
循环,该循环将每一行读入变量,line
直到管道关闭。如果line
以0x
(匹配正则表达式'^0x')开头,则每个十六进制数字(${(z)param}
将一行拆分为单词,就像 zsh 会拆分命令行一样)转换为八进制(实际上,十六进制数字由 shell 隐式转换为十进制,然后格式化为八进制通过printf
)。如果line
不开始按0x
原样打印。
您还可以使用perl
:
stdbuf -oL showkey -s | perl -e '
while(<STDIN>){
if(/^0x/){
printf "0%o ", hex($_) for split;
print $/;
} else {
print
}
}'
同样的原则也适用。
答案2
当您在“ascii 模式”下运行它时,它会打印密钥的八进制表示形式。
例子
$ sudo showkey -a
Press any keys - Ctrl-D will terminate this program
a 97 0141 0x61
b 98 0142 0x62
c 99 0143 0x63
d 100 0144 0x64
e 101 0145 0x65
f 102 0146 0x66
g 103 0147 0x67
1 49 0061 0x31
2 50 0062 0x32
3 51 0063 0x33
^D 4 0004 0x04
第三列是八进制代码。
showkey
手册页摘录
当处于“ascii”转储模式时,showkey 根据当前的键盘映射将按下的键的十进制、八进制和十六进制值打印到标准输出。