私はバイナリファイルで2バイトを見つけ、その2バイトの値を増やしてファイルから置き換えようとしています。この2バイトは0x82-0x83の位置にあります。現在、次のコマンドを使用してこれらの2バイトを正常に抽出しました。
#!/usr/bin/env bash
BYTES=$(tail -c +131 "$1" | head -c 2)
これらのバイトの値はです1B 1F
。私は立ち往生しています:
- バイトを整数に変換するには?
6943
10進数でなければなりません。 - ファイルにバイナリデータを追加/エコーする方法
- 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