2017-01-23 13 views
3

Мне нужно изменить байт при некотором смещении двоичного файла. , например, если моим входным файлом является A.bin, а выходной файл - B.bin. Мне нужно прочитать байт при смещении 0x40c из файла A.bin, очистить до 0 наименее значимых 2 битов этого байта, а затем записать файл B.bin равный A.bin, но с вычисленным байтом со смещением 0x40cизменить байт в двоичном файле с помощью стандартных средств командной строки linux

Я могу использовать bash и стандартные команды, такие как printf и dd.

Я могу легко write a byte into a binary file, но я не знаю, как читать.

+0

http://unix.stackexchange.com/questions/155085/fetching-individual-bytes-from-a-binary-file-into-a-variable-with-bash? –

+0

Возможный дубликат [CLI: записать байт по адресу (hexedit/изменить двоичный файл из командной строки)] (https://stackoverflow.com/questions/4783657/cli-write-byte-at-address-hexedit-modify-binary -from-the-command-line) – eadmaster

ответ

3
# read 1 byte at offset 40C 
b_hex=$(xxd -seek $((16#40C)) -l 1 -ps A.bin -) 
# delete 3 least significant bits 
b_dec=$(($((16#$b_hex)) & $((2#11111000)))) 
cp A.bin B.bin 
# write 1 byte back at offset 40C 
printf "00040c: %02x" $b_dec | xxd -r - B.bin 

Испытано в bash и zsh на OSX и Linux.

В последней строке объяснено:

  • 00040c: это смещение xxd должен написать
  • %02x преобразует $b из дес шестнадцатеричному
  • xxd -r - B.bin: обратный дамп (xxd -r), возьмите номер строки и гекс stdin (-) и напишите на B.bin
+0

У меня есть ответ, потому что мне это нравится, но OP запросил два разных файла, поэтому 'cp A.bin B.bin' следует помещать где-то перед окончательным' dd', который будет работать на 'B.bin'; и, что более важно, это не работает, если '$ b' равно ASCII NUL ... – Dario

+0

@Dario благодарит за то, что он должен работать с новым файлом, добавил, что в – hansaplast

+0

@Dario woult он не работает на' NUL '? 'b = $ (chr 0) && printf $ b | dd of = B.bin seek = $ ((16 # 40C)) bs = 1 count = 1 conv = notrunc' работает для меня – hansaplast

 Смежные вопросы

  • Нет связанных вопросов^_^