获取八进制格式的扫描码

获取八进制格式的扫描码

使用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直到管道关闭。如果line0x(匹配正则表达式'^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 根据当前的键盘映射将按下的键的十进制、八进制和十六进制值打印到标准输出。

相关内容