Bagaimana saya bisa menggunakan Bash untuk menemukan 2 byte dalam file biner, meningkatkan nilainya, dan mengganti?

8

Saya mencoba untuk menemukan dua byte di dalam file biner, kemudian meningkatkan nilai kedua byte dan menggantinya di dalam file. Kedua byte tersebut berada pada posisi 0x82-0x83. Untuk saat ini saya telah berhasil mengekstrak kedua byte tersebut menggunakan ini:

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

Mereka byte memiliki nilai: 1B 1F. Saya terjebak dengan:

  1. Bagaimana cara mengubah byte ke integer? Itu harus 6943desimal.
  2. Cara menambahkan / menggema data biner ke file
  3. Cara menulis peningkatan byte di dalam file pada posisi 0x82-0x83. Saya bisa menggunakan head -c 130 original.bin >> new_file.bin && magic_command_writing_bytes_to_file >> new_file.bin && tail -c +133 original.bin, tetapi harus ada cara yang lebih baik.

Saya bisa melakukannya di PHP, seharusnya lebih mudah, tapi saya tertarik bagaimana melakukan ini di bash.

piotrekkr
sumber

Jawaban:

5

Pengujian dengan file ini:

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

Jadi dalam hal ini 1B 1Fberada pada posisi 12.

  • Konversi ke integer (mungkin ada cara yang lebih mudah)

    $ echo 'ibase=16; '`xxd -u -ps -l 2 -s 12 test.txt`  | bc
    6943
    
  • Dan sebaliknya:

    $ printf '%04X' 6943 | xxd -r -ps | hexdump -C
    00000000  1b 1f                                             |..|
    $ printf '%04X' 4242 | xxd -r -ps | hexdump -C
    00000000  10 92                                             |..|
    
  • Dan memasukkannya kembali ke file:

    $ 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
    
  • Hasil:

    $ 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.|
    
frostschutz
sumber
Ya, itulah tepatnya yang saya cari. Terima kasih.
piotrekkr
@frostschutz: Ada bug — hilang \x- di baris dua kode contoh Anda. Seharusnya begitu echo -n $'\x1b\x1f' >> test.txt.
erik
1
Konversi ke integer (mungkin ada cara yang lebih mudah) Oh ya, ada! :) erik memilih perintah terbaik, jadi saya hanya akan menyesuaikan kalimatnya dengan Anda: printf "%d" 0x1B1Fakan melakukan pekerjaan dengan baik untuk mendapatkan 6943hasil Anda ; mulai dari itu, Anda dapat menggunakan garis yang secara signifikan lebih pintar seperti printf "%d" $(xxd -u -ps -l 2 -s 12 test.txt)dan Anda tidak perlu bclagi.
syntaxerror
2

Oh maaf. Jawaban ini sudah usang, karena saya pikir Anda memiliki nilai heksadesimal yang ditulis sebagai ascii di file Anda.


Anda dapat mengonversi angka heks menjadi sistem desimal via printf "%d" 0x1B1F.

Jika Anda telah menyimpan byte dalam sebuah variabel BYTES=1B1Fmaka Anda mendapatkan hasilnya printf "%d" 0x$BYTES.

Jadi, jika Anda ingin menambah angkanya

$ echo $(($(printf "%d" 0x$BYTES) +1))
6944

Kemudian konversikan kembali

printf '%X' $(($(printf "%d" 0x$BYTES) +1))
1B20
erik
sumber