我正在从我的 Raspberry Pi 读取串行数据,我所做的只是一个 Hexdump 我必须找到标头,然后转到标头中的数据的第二个字节,例如: ed 13 74,我必须取值 4 ,转换将其转换为十进制并加 2(在本例中为 4+2 = 6),我必须从标头读取 6 个字节的数据
我必须再次向前移动,找到下一个带有标头的数据包并重复相同的操作
我试图通过编写脚本来完成这一切
答案1
您的描述与提供的十六进制转储不太吻合,因为后面的所有第二个字节ed
都是00
.但是,您应该尝试至少掌握 Unix 中用于字符串处理的更复杂的工具之一,即awk
.
您可以通过在每行中放置一个十六进制数字来简化数据流。通过您的示例,您可以将其通过管道传输tr -s ' ' '\n'
。然而,更有用的是,如果您这样做,man hexdump
您可以看到它提供了输出格式的选项,每行打印一个数字,这样您就不需要进一步操作它。例如
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
} '
这会检查该行的第一个字是否为ed
,然后用于getline
将下一行读入变量 byte1,并将后面的行读入变量 byte2。获取substr()
最后一个字符,将其与“0x”连接并调用strtonum
将十六进制转换为十进制。该while
循环调用 getline 次数并连接数据。