Bash를 사용하여 바이너리 파일에 16진수 값 쓰기

Bash를 사용하여 바이너리 파일에 16진수 값 쓰기

바이너리 파일에 특정 수의 0을 자동으로 쓰는 방법은 무엇입니까?

나는 쓴다:

#!/bin/bash
for i in {0..127};
do
    echo -e -n "\x00" >> file.bin
done

그러나 Bless 출력 보기 파일을 사용 2D 65 20 2D 6E 20 5C 78 30 30 0A하면 -e -n \x00.

답변1

printf휴대성이 있어야 한다그리고 8진수 문자 이스케이프를 지원합니다.

i=0
while [ "$i" -le 127 ]; do
    printf '\000'
    i=$((i+1)) 
done >> file.bin

( printf그런 식으로 16진수 이스케이프를 지원할 필요는 없지만 \x00많은 쉘에서는 지원합니다.)

바라보다왜 printf가 echo보다 나은가요?문제가 발생했습니다 echo.

답변2

파일이 0이면 분명한 것은 다음과 같습니다.

dd if=/dev/zero of=file.bin bs=1 count=128  

이는 단일 바이트 쓰기를 수행하기 때문에 실제로는 매우 비효율적입니다. 다음을 쉽게 사용할 수 있습니다.

dd if=/dev/zero of=file.bin bs=128 count=1  

여기서 bs' is the 'block size' andcount`는 블록이 몇 개 있는지를 나타냅니다. 여러 개의 작은 덩어리보다 한 덩어리로 쓰는 것이 더 좋습니다!

위의 명령은 다음과 같습니다.아니요에 첨부하면 file.bin덮어쓰게 됩니다. 한 가지 방법은 다음과 같습니다.

dd if=/dev/zero bs=128 count=1 >> file.bin  

설명: 그렇지 않은 경우 표준 출력에 쓴 of=다음 dd출력 파일에 추가합니다.

답변3

  1. printf모든 매개변수에 동일한 형식이 재사용됩니다.
  2. 이 형식은 %.0s인수의 일부를 인쇄하지 않습니다.

이것들을 결합하면 꽤 좋은 결과를 얻을 수 있습니다

$ printf '\0%.0s' {1..128} >128nulls

128개의 null 값.

관련 정보