저는 이진 파일에서 2바이트를 찾은 다음 해당 2바이트의 값을 증가시켜 파일에서 바꾸려고 합니다. 이 2바이트는 0x82-0x83 위치에 있습니다. 현재 다음 명령을 사용하여 이 두 바이트를 성공적으로 추출했습니다.
#!/usr/bin/env bash
BYTES=$(tail -c +131 "$1" | head -c 2)
이러한 바이트의 값은 입니다 1B 1F
. 나는 붙어있다 :
- 바이트를 정수로 변환하는 방법은 무엇입니까?
6943
십진수 여야 합니다 . - 파일에 바이너리 데이터를 추가/에코하는 방법
- 0x82-0x83 위치의 파일 내에 증분 바이트를 쓰는 방법. 이것을 사용할 수 있지만
head -c 130 original.bin >> new_file.bin && magic_command_writing_bytes_to_file >> new_file.bin && tail -c +133 original.bin
더 좋은 방법이 있을 것입니다.
PHP에서 이 작업을 수행할 수 있으며 더 쉬울 것입니다. 하지만 Bash에서 수행하는 방법에 관심이 있습니다.
답변1
테스트에 이 파일을 사용하십시오.
$ echo hello world > test.txt
$ echo -n $'\x1b\x1f' >> test.txt
$ echo whatever >> test.txt
$ hexdump -C test.txt
00000000 68 65 6c 6c 6f 20 77 6f 72 6c 64 0a 1b 1f 77 68 |hello world...wh|
00000010 61 74 65 76 65 72 0a |atever.|
$ grep -a -b --only-matching $'\x1b\x1f' test.txt
12:
따라서 이 경우에는 1B 1F
.12
정수로 변환(더 쉬운 방법이 있을 수 있음)
$ echo 'ibase=16; '`xxd -u -ps -l 2 -s 12 test.txt` | bc 6943
그 반대:
$ printf '%04X' 6943 | xxd -r -ps | hexdump -C 00000000 1b 1f |..| $ printf '%04X' 4242 | xxd -r -ps | hexdump -C 00000000 10 92 |..|
파일에 다시 넣으십시오.
$ printf '%04X' 4242 | xxd -r -ps | dd of=test.txt bs=1 count=2 seek=12 conv=notrunc 2+0 records in 2+0 records out 2 bytes (2 B) copied, 5.0241e-05 s, 39.8 kB/s
결과:
$ hexdump -C test.txt 00000000 68 65 6c 6c 6f 20 77 6f 72 6c 64 0a 10 92 77 68 |hello world...wh| 00000010 61 74 65 76 65 72 0a |atever.|
답변2
아 미안. 귀하의 파일에 ASCII로 작성된 16진수 값이 있다고 생각하기 때문에 이 답변은 오래되었습니다.
16진수를 10진수로 변환하면 됩니다 printf "%d" 0x1B1F
.
변수에 바이트를 저장한 경우 BYTES=1B1F
결과를 얻게 됩니다 printf "%d" 0x$BYTES
.
그래서 양을 늘리고 싶다면
$ echo $(($(printf "%d" 0x$BYTES) +1))
6944
그런 다음 다시 변환하세요.
printf '%X' $(($(printf "%d" 0x$BYTES) +1))
1B20