나는 Raspberry Pi에서 직렬 데이터를 읽고 있습니다. 내가 하는 일은 Hexdump입니다. 헤더를 찾은 다음 헤더에 있는 데이터의 두 번째 바이트로 이동해야 합니다. 예: ed 13 74, 값을 가져와야 합니다. 4인 경우 변환은 이를 10진수로 변환하고 2를 더합니다(이 경우 4+2 = 6). 헤더에서 6바이트의 데이터를 읽어야 합니다.
다시 앞으로 이동해야 하며 헤더가 있는 다음 패킷을 찾아 동일한 작업을 반복해야 합니다.
대본을 써서 다 하려고 했는데
답변1
귀하의 설명은 제공된 16진수 덤프와 완전히 일치하지 않습니다. 왜냐하면 그 이후의 두 번째 바이트가 모두 이기 때문 ed
입니다 00
. 그러나 지금 당장 Unix에서 문자열 처리를 위한 보다 정교한 도구 중 하나 이상을 마스터해야 합니다 awk
.
각 줄에 16진수를 입력하면 데이터 흐름을 단순화할 수 있습니다. 귀하의 예를 사용하여 파이프할 수 있습니다 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
} '
이는 라인의 첫 번째 단어 가 다음 라인을 변수 byte1로 읽고 다음 라인을 변수 byte2로 읽는 ed
데 사용되는지 확인합니다. 마지막 문자를 getline
가져와서 "0x"로 연결하고 16진수를 10진수로 변환하는 호출을 호출합니다. 루프 는 getline을 여러 번 호출하고 데이터를 연결합니다.substr()
strtonum
while