LINUX.ORG.RU

Тупак. Преобразовать shell'ом (awk/sed)'ом ascii hex <-> char


0

0

Собственно про то, что echo -e '\x41' будет А знаю. Просто стоит тривиальная задача - отпарсить intel hex file с прошивкой, найти там в поле data забитую, естественно в asii hex, asci же строку с его серийником и заменить. Типа автоматизированный скрипт для прошивки большого (относительно) числа плат.

Загвоздка в том, что в intel hex данные идут непрерывно, и просто так тому же awk'ку символ разделитель не задаш.

Пока придумал только парсить поля по сторока в массив т.е. data=( $(cat file.hex | cut -b 10-$reclen) )

и склеивать в строку, что-то типа str=(echo -e "\x$data[i]\x%data[i+1]")

Но я полагаю, что должно существовать более элегантно решение с привлечением (sed/awk)'ка. Так-же я не думаю, что использование чего либо кроме статарных средств shell'а тут необходимо. Я просто хочу сделать простенький набор скриптов для прошивки микрух готовыми hex'ама, а не генератор отчётов логов в pdf.

Заранее спасибо за помощь.

А контрольные суммы у тебя не слезут, придётся и их править?
вообще есть команды printf, od -x, и т.п.
я бы на Пёрле написал с pack/unpack

anonymous
()

Или перл или уж на Си.

sdio ★★★★★
()

Можно и извратиться:
bin->hex ascii-> edit-> bin

sdio ★★★★★
()

man xxd
man od

anonymous
()

Вы бы уж просто привели фрагмент файла, а то описание формата на марсианском понимать сложно:

>Загвоздка в том, что в intel hex данные идут непрерывно, и просто так тому же awk'ку символ разделитель не задан.

Символ разделитель awk --- опция -F.

Если речь идет о формате обычного hexdump, то можно сначала файла разделить на 2 файла (с помощью cut -b), одна содержит смещения, а другая сами данные, потом эти данные превратить в сплошную строку:

cat file.data.hex | tr " " "\n" | sed 's/[0-9a-f][0-9a-f]/& /' | tr "\n" " "

ее можно передать sed 's/41 42/40 41/, а дальше эту строку снова отформатировать как надо (командой fmt), а потом, чтобы получились смещения, склеить файлы (paste).

То есть, делать echo -e "\x$data[i]\x%data[i+1]" не нужно, проще представить серийник и заменяемое заначение в виде hexdump.

mky ★★★★★
()
Ответ на: комментарий от mky

fnx - просплюсь, допалзу до работы - поробую.

marsijanin ★★
() автор топика

Для точно такой же задачи вначале конвертировал в binary при помощи objcopy, затем менял байты в бинарнике, а потом обратно конвертировал в hex.

kpanic ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.