바이너리 파일에서 한 번에 한 바이트씩 추출하여 직렬 포트로 보낸 다음 다음 바이트를 보내기 전에 한 바이트가 돌아올 때까지 기다리는 매우 간단한 bash 스크립트를 만들어야 합니다. 기성 솔루션은 작동하지 않기 때문에 이는 EEPROM 프로그래머에게 적합합니다.
저는 주로 파일에서 변수로 바이트를 추출하는 작업을 하고 있습니다. 그 외에는 값을 직렬 포트에 에코하고 dd를 사용하여 다시 읽을 수 있다는 것을 알고 있습니다. (더 좋은 방법이 있나요?)
도와주셔서 감사합니다!
답변1
예를 들어 바이너리 파일에서 오프셋 100( )에 있는 바이트를 읽으려면 dd
or (Vim의 일부)을 사용하여 다음을 시도해 보세요.xxd
-l
-s
xxd -p -l1 -s 100 file.bin
16진수 오프셋을 사용하려면 Bash에서 다음 구문을 사용할 수 있습니다 $((16#64))
. 예:
echo $((16#$(xxd -p -l1 -s $((16#FC)) file.bin)))
오프셋에서 바이트를 읽고 FC
이를 10진수 형식으로 인쇄합니다.
또는 를 사용하세요 dd
. 예를 들면 다음과 같습니다.
dd if=file.bin seek=$((16#FC)) bs=1 count=5 status=none
16진수 오프셋에 5바이트의 원시 데이터를 덤프합니다 FC
.
그런 다음 변수에 할당할 수 있지만데이터에 NULL 바이트가 있으면 작동하지 않습니다.이므로 건너뛸 수 있습니다( xxd -a
). 또는 해결 방법으로 일반 16진수 형식으로 저장할 수 있습니다.
예를 들어:
16진수 형식의 바이트가 포함된 변수로 오프셋 10의 10바이트를 읽습니다.
hex=$(xxd -p -l 10 -s 10 file.bin)
그런 다음 파일이나 장치에 씁니다.
xxd -r -p > out.bin <<<$hex
Bash의 유용한 기능은 다음과 같습니다.
set -e
# Read single decimal value at given offset from the file.
read_value() {
file="$1"
offset="$2"
[ -n "$file" ]
[ -n "$offset" ]
echo $((16#$(xxd -p -l1 -s $offset "$file")))
}
# Read bytes in hex format at given offset from the file.
read_data() {
file="$1"
offset="$2"
count="$3:-1"
xxd -p -l $count -s $offset "$file"
}
사용 예:
read_value file.bin $((16#FC)) # Read 0xFC offset from file.bin.
답변2
귀하가 요청하시는 내용의 전체적인 그림을 제가 잘 이해하고 있는지 잘 모르겠습니다. 하지만 고려해 볼만한 몇 가지 접근 방식이 있습니다.
dd
입력 파일을 읽으 려면
실행 3<입력 파일 사실이긴 하지만 하다 dd bs=1 count=1 <&3 > this_byte 만약에! [ -s this_byte ] # 크기가 0이면 작업이 완료된 것입니다. 그 다음에 나머지 필리핀 제도 코드 사용법이 바이트문서 ︙ 완벽한
od
입력 파일을 소화하기 위해
OD-BV입력 파일|a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 동시에 읽기 do # 건너뛰기 $a0; 이것이 주소입니다. "$a1" "$a2" "$a3" "$a4" "$a5" "$a6" "$a7" "$a8" "$a9" "$a10" \의 byte_val의 경우 “$a11” “$a12” “$a13” “$a14” “$a15” “$a16” 하다 if ["$byte_val" = ""] 그 다음에 나머지 필리핀 제도 코드 사용법$byte_val값 예를 들어:echo -e "\0$byte_val\c" ︙ 완벽한 완벽한
답변3
작은 C 프로그램이나 (거의) Python이나 Perl과 같은 스크립팅 언어의 코드 한 줄을 사용하여 이 작업을 수행하는 것이 더 쉬울 수도 있습니다.
유닉스 쉘은사용자 명령 통역사에는 기본 프로그래밍 기능이 있습니다(반복 명령을 쉽게 작성할 수 있도록). Bourne 쉘 버전이 다음과 같기 때문에 종종 (잘못) 사용됩니다.보장하다이것은 특별히 좋은(또는 심지어 절반 정도의) 프로그래밍 언어이기 때문이 아니라 모든 Unix 시스템에서 사용할 수 있습니다.
답변4
당신은 그것을 사용할 수 있습니다 perl
:
$ printf '%s%s%s' 'ăâé' | LC_ALL=C.UTF-8 perl -Mopen=locale -ne '
BEGIN { $/ = \1 }
printf "%s\n", $_;
'
ă
â
é