Text-Processing

我如何使用 Bash 在二進製文件中查找 2 個字節,增加它們的值並替換?

  • August 30, 2013

我試圖在二進製文件中找到兩個字節,然後增加這兩個字節的值並在文件中替換它們。這兩個字節位於 0x82-0x83 位置。現在我已經成功地提取了這兩個字節:

#!/usr/bin/env bash
BYTES=$(tail -c +131 "$1" | head -c 2)

這些字節具有值:1B 1F. 我被困在:

  1. 如何將字節轉換為整數?它應該是6943十進制的。
  2. 如何將二進制數據附加/回顯到文件
  3. 如何在 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 中做到這一點很感興趣。

使用此文件進行測試:

$ 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.|

引用自:https://unix.stackexchange.com/questions/88848