0

我有一个命令

for i in {1..9} ; do cansend slcan0 "7e0#02090"$i"0000000000"

我如何发送相同的命令,但 $i 发送 4 个字节的 HEX。有点像蛮力?

4

2 回答 2

2

您可以使用该printf实用程序%04x作为格式说明符(0pad、4characters、format as he x):

for i in {1..9}; do
  command=$(printf "7e0#02090%04x0000000000" $i)
  echo cansend slcan0 "$command"  # remove `echo` here :)
done

打印出来

cansend slcan0 7e0#0209000010000000000
cansend slcan0 7e0#0209000020000000000
cansend slcan0 7e0#0209000030000000000
cansend slcan0 7e0#0209000040000000000
cansend slcan0 7e0#0209000050000000000
cansend slcan0 7e0#0209000060000000000
cansend slcan0 7e0#0209000070000000000
cansend slcan0 7e0#0209000080000000000
cansend slcan0 7e0#0209000090000000000
于 2019-03-14T11:41:43.247 回答
0

可以使用大括号扩展来生成所有 4 字节十六进制代码序列(00000000, 00000001, 00000002, ..., FFFFFFFF)的列表。

{{0..9},{A..F}}生成列表0 1 2 … F
{{0..9},{A..F}}{{0..9},{A..F}}生成列表00 0 02 … FF
等等。
对于 4 个字节,您必须重复{{0..9},{A..F}}8 次,因为每个字节都有两个十六进制数字。

for i in {{0..9},{A..F}}{{0..9},{A..F}}{{0..9},{A..F}}{{0..9},{A..F}}{{0..9},{A..F}}{{0..9},{A..F}}{{0..9},{A..F}}{{0..9},{A..F}}; do
   cansend slcan0 "7e0#02090${i}0000000000"
done

虽然这种方法对于两位或三位数字可能是可行的,但我强烈建议不要在这种情况下使用它。上面的脚本不可读而且很慢。

bash 中的下一个更好的事情是……</p>

bytes=4
((max=2**(bytes*8)-1))
for ((i=0; i<max; i++)); do
   printf -v hex %08x "$i"
   cansend slcan0 "7e0#02090${hex}0000000000"
done

...但请记住,这将比从(例如)python 程序发送序列慢得多,因为每次您想向slccan0发送内容时,它都不必启动新进程。

于 2019-03-14T12:12:59.857 回答