Làm cách nào tôi có thể sử dụng Bash để tìm 2 byte trong tệp nhị phân, tăng giá trị của chúng và thay thế?


8

Tôi đang cố gắng tìm hai byte trong tệp nhị phân, sau đó tăng giá trị của hai byte đó và thay thế chúng trong tệp. Hai byte đó nằm trên các vị trí 0x82-0x83. Cho đến bây giờ tôi đã trích xuất thành công hai byte đó bằng cách sử dụng:

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

Những byte đó có giá trị : 1B 1F. Tôi bị mắc kẹt với:

  1. Làm thế nào để chuyển đổi byte thành số nguyên? Nó nên là 6943số thập phân.
  2. Cách nối / lặp dữ liệu nhị phân vào tập tin
  3. Cách ghi byte tăng trong tệp vào vị trí 0x82-0x83. Tôi có thể sử dụng head -c 130 original.bin >> new_file.bin && magic_command_writing_bytes_to_file >> new_file.bin && tail -c +133 original.bin, nhưng phải có cách tốt hơn.

Tôi có thể làm điều đó trong PHP, nó sẽ dễ dàng hơn, nhưng tôi quan tâm làm thế nào để làm điều này trong bash.

Câu trả lời:


5

Kiểm tra với tập tin này:

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

Vì vậy, trong trường hợp 1B 1Fnày là ở vị trí 12.

  • Chuyển đổi sang số nguyên (có thể có một cách dễ dàng hơn)

    $ echo 'ibase=16; '`xxd -u -ps -l 2 -s 12 test.txt`  | bc
    6943
    
  • Và ngược lại:

    $ printf '%04X' 6943 | xxd -r -ps | hexdump -C
    00000000  1b 1f                                             |..|
    $ printf '%04X' 4242 | xxd -r -ps | hexdump -C
    00000000  10 92                                             |..|
    
  • Và đưa nó trở lại vào tập tin:

    $ 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
    
  • Kết quả:

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

Vâng, đó chính xác là những gì tôi đang tìm kiếm. Cảm ơn.
piotrekkr

@frostschutz: Có một lỗi thiếu sót \x- trong dòng hai mã ví dụ của bạn. Nó phải echo -n $'\x1b\x1f' >> test.txt.
erik

1
Chuyển đổi sang số nguyên (có lẽ có một cách dễ dàng hơn) Ồ vâng, có! :) erik đã chọn lệnh tốt nhất, vì vậy tôi sẽ chỉ điều chỉnh dòng của anh ấy với lệnh của bạn: printf "%d" 0x1B1Fsẽ làm tốt công việc để có được 6943kết quả của bạn ; đi từ đó, bạn có thể sử dụng một dòng thông minh hơn đáng kể như printf "%d" $(xxd -u -ps -l 2 -s 12 test.txt)thay vào đó và bạn sẽ không cần bcthêm nữa.
cú pháp

2

Ồ xin lỗi. Câu trả lời này đã lỗi thời, vì tôi nghĩ rằng bạn có các giá trị thập lục phân được viết là ascii trong tệp của bạn.


Bạn có thể chuyển đổi số hex thành hệ thập phân qua printf "%d" 0x1B1F.

Nếu bạn đã lưu các byte trong một biến BYTES=1B1Fthì bạn sẽ nhận được kết quả printf "%d" 0x$BYTES.

Vì vậy, nếu bạn muốn tăng số lượng

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

Sau đó chuyển đổi lại

printf '%X' $(($(printf "%d" 0x$BYTES) +1))
1B20
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.