У меня есть файл с двоичными данными, и я должен заменить несколько байтов в определенном положении. Я придумал следующее к прямому удару к смещению и показываю мне, что это нашло место, которое я хочу:
dd bs=1 if=file iseek=24 conv=block cbs=2 | hexdump
Теперь, для использования "файла" в качестве вывода:
echo anInteger | dd bs=1 of=hextest.txt oseek=24 conv=block cbs=2
Это, кажется, работает просто великолепно, я могу рассмотреть изменения, внесенные в Hex-редакторе. Проблема, "anInteger" будет записан как представление ASCII того целого числа (который имеет смысл), но я должен записать двоичное представление.
Я хочу использовать удар для этого, и сценарий должен работать на как можно большем количестве систем (я не знаю, установят ли целевой системе Python или безотносительно).
Как я говорю команде преобразовывать вход в двоичный файл (возможно от шестнадцатеричного числа)?
Вы можете использовать echo для вывода определенных байтов, используя шестнадцатеричное или восьмеричное исчисление. Например:
echo -n -e \\x30
выведет ascii 0 (0x30)
(-n удалить новую строку)
printf
более портативен, чем echo
. Эта функция принимает десятичное целое число и выводит байт с этим значением:
echobyte () {
if (( $1 >= 0 && $1 <= 255 ))
then
printf "\\x$(printf "%x" $1)"
else
printf "Invalid value\n" >&2
return 1
fi
}
$ echobyte 97
a
$ for i in {0..15}; do echobyte $i; done | hd
00000000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f |................|
00000010
Если вы готовы полагаться на bc (что довольно часто)
echo -e "ibase=16\n obase=2 \n A1" | bc -q
может помочь.
Вы можете поместить нужный ввод в файл и использовать опцию "if=" для dd, чтобы вставить именно тот ввод, который вы хотите.
Сработало как лакомство. Я использовал следующий код, чтобы заменить 4 байта в байте 24 в little endian двумя целыми числами (1032 и 1920). Код не усекает файл.
echo -e \\x08\\x04\\x80\\x07 | dd of=<file> obs=1 oseek=24 conv=block,notrunc cbs=4
Еще раз спасибо.