bash를 사용하여 바이너리 파일의 단일 바이트를 변수로 추출합니다.

bash를 사용하여 바이너리 파일의 단일 바이트를 변수로 추출합니다.

바이너리 파일에서 한 번에 한 바이트씩 추출하여 직렬 포트로 보낸 다음 다음 바이트를 보내기 전에 한 바이트가 돌아올 때까지 기다리는 매우 간단한 bash 스크립트를 만들어야 합니다. 기성 솔루션은 작동하지 않기 때문에 이는 EEPROM 프로그래머에게 적합합니다.

저는 주로 파일에서 변수로 바이트를 추출하는 작업을 하고 있습니다. 그 외에는 값을 직렬 포트에 에코하고 dd를 사용하여 다시 읽을 수 있다는 것을 알고 있습니다. (더 좋은 방법이 있나요?)

도와주셔서 감사합니다!

답변1

예를 들어 바이너리 파일에서 오프셋 100( )에 있는 바이트를 읽으려면 ddor (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진수 형식으로 저장할 수 있습니다.

예를 들어:

  1. 16진수 형식의 바이트가 포함된 변수로 오프셋 10의 10바이트를 읽습니다.

    hex=$(xxd -p -l 10 -s 10 file.bin)
    
  2. 그런 다음 파일이나 장치에 씁니다.

    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", $_;
'
ă
â
é

관련 정보