Заменить части файла на 0xFF? - PullRequest
1 голос
/ 26 февраля 2020

Я хочу изменить файл, чтобы каждый байт из местоположения 0x3000 в 0xDC000 заменялся на 0xFF, все остальное должно быть неизменным.

Как сделать sh это стандартным Linux инструментов?

Ответы [ 2 ]

3 голосов
/ 26 февраля 2020

Это jhn c ответ с небольшими улучшениями (объяснено в конце этого ответа). Если jhn c решит превратить свой комментарий в ответ, пожалуйста, замените его / вместо этого.

#! /bin/bash
overwrite() {
    file="$1"; from="$2"; to="$3"; with="$4"
    yes '' | tr \\n "\\$(printf %o "$with")" |
    dd conv=notrunc bs=1 seek="$((from))" count="$((to-from))" of="$file"
}

В вашем случае вы бы использовали вышеуказанную функцию, например

overwrite yourFile 0x3000 0xDC000 0xFF

Начальный и конечный байты начинаются с 0. Начало включительно, а конец - эксклюзив. Пример:

$ printf 00000 > file
$ overwrite file 1 3 0x57
$ hexdump -C file
00000000  30 57 57 30 30   |0WW00|
00000005

Внесены улучшения:

  • Исправлено неправильно count=... и объяснена интерпретация начала и конца.

  • Разрешить заполнение нулевыми байтами.
    Если вы хотите записать нулевые байты 0x00, вы не можете использовать yes $'\x00'. Нулевой байт будет представлять конец строки аргумента yes, что делает вызов эквивалентным yes ''. Так как yes '' | tr -d \\n не выводит, dd будет ждать бесконечно.
    Команда, представленная в этом ответе, позволяет заполнить область любым байтом (выберите один из 0x00 до 0xFF).

1 голос
/ 27 февраля 2020

Если Perl - ваш выбор, попробуйте следующее:

perl -e '
$start = 0x3000;                        # start position to overwrite
$end = 0xDC000;                         # end position to overwrite
$file = "file";                         # filename to modify (replace with your filename)

open(FH, "+< $file") or die "$file";    # open the file "$file" to both read & write with the filehandle "FH"
seek(FH, $start, 0);                    # jump to the start position
for ($i = $start; $i < $end; $i++) {    # loop over the overwrite area
    print FH "\xFF";                    # replace the byte with 0xFF
}
close(FH);
'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...