あんパン

こしあん派

スペース区切りの文字列を2つずつ取って表示

usbhid-dumpでdumpしたUSBのreport descriptorを見るとき、2byteで1セットになることが多い(当然例外はめっちゃあるが…)ので一旦2項目ずつに整理して見てみたい。つまり

003:007:000:DESCRIPTOR         1668742987.009398
 05 01 09 06 A1 01 05 07 19 E0 29 E7 15 00 25 01
 75 01 95 08 81 02 75 08 95 01 81 01 05 08 19 01
 29 05 75 01 95 05 91 02 75 03 95 01 91 01 05 07
 19 00 2A FF 00 15 00 26 FF 00 75 08 95 06 81 00
 C0

これを

05 01
09 06
A1 01
05 07
...
75 08
95 06
81 00
C0

こうしたい。間違ってるところはあとで修正する前提。Rubyだと近いことを Enumerable#each_slice でできる。

シュッとワンライナー書けないかな〜と思っていたところ、xargsでそれっぽいことができそうだった。05 01 09 ... をクリップボードに入れておいて

$ xsel -ob | sed 's/ /\n/g' | grep -v '^$' | xargs -L2 echo
05 01
09 06
A1 01
05 07
...
75 08
95 06
81 00
C0

という調子。xargsの -L オプションを指定すると一回で複数の引数を取って展開してくれるので、単純にこれをechoする。普段便利に使ってるコマンドでも意外と知らないオプションがある。


そしてこの記事を書き終えた後に

$ sudo usbhid-dump -e descriptor -a ***:*** | grep -v : | xxd -r -p | hidrd-convert -o code
0x05, 0x01,         /*  Usage Page (Desktop),               */
0x09, 0x02,         /*  Usage (Mouse),                      */
0xA1, 0x01,         /*  Collection (Application),           */
0x09, 0x01,         /*      Usage (Pointer),                */

で一番やりたかったことができるのを知るのであった……