использование удара: запишите разрядное представление целого числа в файл

У меня есть файл с двоичными данными, и я должен заменить несколько байтов в определенном положении. Я придумал следующее к прямому удару к смещению и показываю мне, что это нашло место, которое я хочу:

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 или безотносительно).

Как я говорю команде преобразовывать вход в двоичный файл (возможно от шестнадцатеричного числа)?

15
задан Chris Seymour 10 March 2013 в 15:44
поделиться

5 ответов

Вы можете использовать echo для вывода определенных байтов, используя шестнадцатеричное или восьмеричное исчисление. Например:

echo -n -e \\x30 

выведет ascii 0 (0x30)

(-n удалить новую строку)

12
ответ дан 1 December 2019 в 00:59
поделиться

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
14
ответ дан 1 December 2019 в 00:59
поделиться

Если вы готовы полагаться на bc (что довольно часто)

echo -e "ibase=16\n obase=2 \n A1" | bc -q

может помочь.

1
ответ дан 1 December 2019 в 00:59
поделиться

Вы можете поместить нужный ввод в файл и использовать опцию "if=" для dd, чтобы вставить именно тот ввод, который вы хотите.

0
ответ дан 1 December 2019 в 00:59
поделиться

Сработало как лакомство. Я использовал следующий код, чтобы заменить 4 байта в байте 24 в little endian двумя целыми числами (1032 и 1920). Код не усекает файл.

echo -e \\x08\\x04\\x80\\x07 | dd of=<file> obs=1 oseek=24 conv=block,notrunc cbs=4

Еще раз спасибо.

5
ответ дан 1 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: