редактирование шестнадцатеричных / двоичных файлов в ограниченном Linux

У меня очень ограниченный Linux с несколькими базовыми командами Linux. Мне нужно заменить несколько символов в шестнадцатеричном / двоичном файле:

ВХОД:

# hexdump -C block.bin
00000000  11 11 50 04 42 00 00 00  58 00 00 00 3c 0e e2 d4  |..P.B...X...<...|
00000010  50 0b 00 00 00 80 00 00  00 00 00 00 00 00 d0 d7  |P...............|
00000020  1f 09 00 00 00 00 02 00  00 00 00 04 ff ff ff ff  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000040  28 31 98 5b d3 0e 05 00  00 00 00 00 00 00 00 00  |(1.[............|
00000050  00 00 00 00 00 00 00 00  64 00 00 00 00 00 10 00  |........d.......|
00000060  00 ff ff ff ff 00 00 00  00 03 01 0d 03 01 0d 01  |................|
00000070  00 00 00 00 0c 00 01 02  00 00 00 00 00 ff ff ff  |................|
00000080  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00000180  00 00 20 00 00 00 ff ff  ff ff 01 00 00 0c 00 00  |.. .............|
00000190  04 00 00 00 02 00 00 04  00 00 00 00 00 00 ff ff  |................|
000001a0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00000200  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

Мне нужно изменить следующее:

00000060  00 ff ff ff ff 00 00 00  00 03 01 0d 03 01 0d 01  |................|
00000070  00 00 00 00 0c 00 01 02  00 00 00 00 00 ff ff ff  |................|

в (и перезаписать обратно в тот же файл):

00000060  00 ff ff ff ff 00 00 00  00 03 01 0d 03 01 0d 02  |................|
00000070  01 00 00 00 0c 00 01 02  00 00 00 00 00 ff ff ff  |................|

Как я уже сказал, у меня есть несколько команд: hexdump, od, vi, nano, awk, sed, python. Просматривая Интернет, многие решения требуют установки сторонних разработчиков или использования xxd. И то, и другое использовать не могу.

Какие-либо предложения?

Спасибо!


person Maxim_united    schedule 12.02.2015    source источник
comment
Пожалуйста, уточните точные требования. Вам нужно установить байт в фиксированной позиции на фиксированное значение (от 0000006f до 02), или это более сложно? Зависит ли новое значение от старого, ищете ли вы конкретный шаблон вместо фиксированной позиции и тому подобное.   -  person Wintermute    schedule 12.02.2015
comment
Без xxd, похоже, вам придется написать этот инструмент самостоятельно - значит, вам нужен язык программирования. Ознакомьтесь с ответами здесь: чтение-двоичный-файл-в-питоне, чтобы начать .   -  person n0741337    schedule 12.02.2015
comment
Позиции фиксированы. 0000006f и 00000070 Требуется увеличить оба байта на 1. thx   -  person Maxim_united    schedule 12.02.2015
comment
К сожалению, у меня нулевые познания в Python.   -  person Maxim_united    schedule 12.02.2015
comment
В этой системе нет Perl   -  person Maxim_united    schedule 12.02.2015
comment
Какая оболочка доступна? А у вас есть GNU sed или это что-то более примитивное?   -  person Ben Grimm    schedule 12.02.2015


Ответы (1)


Я не думаю, что пробовать это с помощью sed или awk - разумная идея, поэтому мы остановились на python, который, безусловно, достаточно мощный для этой задачи. Я думаю в этом направлении:

#!/usr/bin/python

# open file in binary mode for reading and writing    
f = open("block.bin", "r+b")

# seek to position and read two bytes
f.seek(0x6f)
data = f.read(2)

# seek to position again
f.seek(0x6f)

# and write the transformed characters back
for d in data:
    f.write(chr(ord(d) + 1))

f.close()
person Wintermute    schedule 12.02.2015