私はRaspberry Piからシリアルデータを読み込んでいます。私がすることはHexdumpです。ヘッダーを見つけて、ヘッダー内のデータの2番目のバイトに移動する必要があります。例: ed 13 74、値を取得する必要があります。 4の場合、変換はそれを10進数に変換し、2を加算します(この場合は4 + 2 = 6)。ヘッダーから6バイトのデータを読み取る必要があります。
もう一度進む必要があり、ヘッダーがある次のパケットを見つけて同じ操作を繰り返す必要があります。
台本を使ってやろうとしました。
答え1
あなたの説明は提供された16進ダンプと完全に一致しません。なぜなら、それ以降の2番目のバイトがすべてであるからed
です00
。しかし、今すぐUnixで文字列を処理するためのより洗練されたツールの1つ以上をマスターする必要がありますawk
。
各行に16進数を入力すると、データフローを簡素化できます。あなたの例を使ってパイプすることができますtr -s ' ' '\n'
。しかし、より便利なことに、これを行うと、1 行man hexdump
に 1 つの数字を印刷して出力形式を指定するオプションが提供され、これ以上操作する必要がなくなります。例えば
hexdump -v -e '1/1 "%02x\n"'
同様のデータが提供されます
2f
ed
3f
00
08
そのデータをこのスクリプトにリンクします。
awk '$1=="ed" {
getline byte1
getline byte2
number = strtonum("0x" substr(byte2,2,1))
print "len is " number
data = byte1 byte2
while(number-->0){getline byte; data = data byte}
print data
} '
これは、行の最初の単語が次の行を変数byte1として読み取り、次の行を変数byte2として読み取るed
ために使用されることを確認します。最後の文字をgetline
取得して「0x」に連結し、16進数を10進数に変換する呼び出しを呼び出します。ループはgetlineを数回呼び出してデータをリンクします。substr()
strtonum
while