У меня есть двоичный файл, который я хотел бы включить в исходный код C (временно, для целей тестирования), поэтому я хотел бы получить содержимое файла в виде строки C, что-то вроде этого:
\x01\x02\x03\x04
Возможно ли это, возможно, с помощью od
или hexdump
утилит? Хотя в этом нет необходимости, если строка может переноситься на следующую строку каждые 16 входных байтов и включать двойные кавычки в начале и конце каждой строки, это было бы еще лучше!
Я знаю, что в строку будет встроен nulls ( \x00
), поэтому мне нужно будет указать длину строки в коде, чтобы эти байты не заканчивали строку раньше.
Ответы:
Вы можете почти делать то, что хотите
hexdump
, но я не могу понять, как получить кавычки и одиночные обратные слэши в строку формата. Так что я делаю небольшую постобработку сsed
. В качестве бонуса я также выделил каждую строку на 4 пробела. :)редактировать
Как указал Cengiz Can, приведенная выше командная строка не справляется с короткими строками данных. Итак, вот новая улучшенная версия:
Как упоминает Malvineous в комментариях, мы также должны передать параметр
-v
verbose,hexdump
чтобы он не сокращал длинные серии идентичных байтов*
.источник
-v
опцию вhexdump
, иначе длинные пробеги одного и того же входного байта приводят к выводу строк, которые говорят"*"
.xxd
есть режим для этого. Параметр-i
/--include
будет:Вы можете записать это в файл, который будет
#include
d, а затем просто получить доступ,foo
как и любой другой массив символов (или связать его). Он также включает в себя объявление длины массива.Вывод обернут в 80 байтов и выглядит по сути как то, что вы могли бы написать вручную:
xxd
как ни странно, это частьvim
дистрибутива, так что, скорее всего, она уже есть. Если нет, то вот где вы его получите - вы также можете создать инструмент самостоятельно изvim
исходного кода.источник
objcopy
было бы лучшеobjcopy
позволит OP связывать двоичные данные с исполняемым файлом в виде объектного файла, что полезно, но не совсем то, о чем здесь идет речь .foo
/foo_len
здесь, и вы бы не тратили много места на хранение. Я убежден, что ОП будет лучшеobjcopy
и что он отвечает его или ее требованиям.objcopy
хорошо, когда он рядом, но он не портативный, а выход еще меньше. Это, безусловно, может быть частью хорошего постоянного решения, но здесь вопрос не в этом.xxd
это хорошо, но результат очень многословный и занимает много места для хранения.Вы можете добиться практически того же, используя
objcopy
; напримерЗатем перейдите
foo.o
по ссылке на вашу программу и просто используйте следующие символы:Это не строковый литерал, но по сути это то же самое, что и строковый литерал во время компиляции (учтите, что строковые литералы на самом деле не существуют во время выполнения; на самом деле, ни один из других ответов на самом деле не дает вам строковый литерал даже во время компиляции) и к ним можно получить доступ практически таким же образом:
Недостатком является то, что вам нужно указать целевую архитектуру, чтобы сделать объектный файл совместимым, и это может быть не тривиально в вашей системе сборки.
источник
Должно быть именно то, что вы просили:
источник
Это короткая утилита, которую я написал, которая, по сути, делает то же самое (изначально размещена в Stack Overflow ):
источник
Если вы в Python, загрузите его в переменную «buff» и используйте что-то вроде этого:
источник