在Linux命令行上发送4个字节的十六进制

时间:2019-03-14 11:38:07

标签: bash shell socketcan

我有一条命令

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

我如何发送相同的命令,但是对于$ i,则发送4个字节的十六进制。有点像蛮力?

2 个答案:

答案 0 :(得分:0)

您可以将printf utility%04x用作格式说明符(0填充,4个字符,格式为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

答案 1 :(得分:0)

可以使用括号扩展来生成所有4字节十六进制代码序列(000000000000000100000002,...,{{ 1}})。

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

{{0..9},{A..F}}

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

bash的下一个更好的选择是……

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

…但是请记住,这比从(例如)python程序发送序列的时间幅值要慢,该程序无需每次都要发送新内容时都需要启动新进程到slccan0。