Mam plik binarny, który chciałbym zawrzeć w moim kodzie źródłowym C (tymczasowo, w celach testowych), więc chciałbym uzyskać zawartość pliku jako ciąg C, coś takiego:
\x01\x02\x03\x04
Czy jest to możliwe, być może przy użyciu narzędzia od
lub hexdump
? Chociaż nie jest to konieczne, jeśli ciąg znaków może zawijać się do następnego wiersza co 16 bajtów wejściowych i zawierać cudzysłowy na początku i na końcu każdego wiersza, byłoby jeszcze ładniej!
Wiem, że łańcuch będzie miał osadzone wartości null ( \x00
), więc będę musiał określić długość łańcucha w kodzie, aby zapobiec przedwczesnemu zakończeniu łańcucha przez te bajty.
Odpowiedzi:
Możesz prawie robić, co chcesz
hexdump
, ale nie mogę dowiedzieć się, jak uzyskać cudzysłowy i pojedyncze odwrotne ukośniki w ciągu formatu. Więc robię trochę post-processingu zsed
. Jako bonus, wciąłem również każdą linię o 4 spacje. :)Edytować
Jak wskazał Cengiz Can, powyższa linia poleceń nie radzi sobie dobrze z krótkimi liniami danych. Oto nowa ulepszona wersja:
Jak Malvineous wspomina w komentarzach, musimy również przekazać
-v
pełną opcję,hexdump
aby zapobiec skracaniu długich ciągów identycznych bajtów*
.źródło
-v
opcjęhexdump
, w przeciwnym razie długie przebiegi tego samego bajtu wejściowego powodują, że linie wyjściowe mówią"*"
.xxd
ma do tego tryb. Opcja-i
/--include
będzie:Możesz zrzucić to do pliku, który ma być
#include
d, a następnie po prostu uzyskać dostęp,foo
jak każda inna tablica znaków (lub połączyć ją). Zawiera także deklarację długości tablicy.Dane wyjściowe są zawinięte do 80 bajtów i wyglądają zasadniczo jak to, co można napisać ręcznie:
xxd
jest nieco dziwnie częściąvim
dystrybucji, więc prawdopodobnie już ją masz. Jeśli nie, to właśnie tam możesz go zdobyć - możesz również zbudować narzędzie samodzielnie zevim
źródła.źródło
objcopy
byłoby lepiejobjcopy
pozwoliłby OP połączyć dane binarne z plikiem wykonywalnym jako plik obiektowy, co jest użyteczne, ale nie do końca o to, o co tutaj proszono.foo
/foo_len
tutaj i nie marnowałbyś miejsca do przechowywania. Jestem przekonany, że lepiej byłoby POobjcopy
i że odpowiada on jego wymaganiom.objcopy
jest w porządku, gdy jest w pobliżu, ale nie jest przenośny, a wyjście jeszcze mniej. Z pewnością może być częścią dobrego stałego rozwiązania, ale nie o to tutaj chodzi.xxd
jest dobry, ale wynik jest bardzo szczegółowy i zajmuje dużo miejsca do przechowywania.Możesz osiągnąć praktycznie to samo za pomocą
objcopy
; na przykładNastępnie połącz
foo.o
się z programem i użyj następujących symboli:To nie jest literał łańcuchowy, ale zasadniczo to samo, co zmienia się literał łańcuchowy podczas kompilacji (weź pod uwagę, że literały łańcuchowe w rzeczywistości nie istnieją w czasie wykonywania; w rzeczywistości żadna z pozostałych odpowiedzi nie daje ci literału łańcuchowego nawet w czasie kompilacji) i można uzyskać do niego dostęp w ten sam sposób:
Minusem jest to, że musisz określić architekturę docelową, aby plik obiektowy był kompatybilny, co może nie być trywialne w systemie kompilacji.
źródło
Powinno być dokładnie to, o co prosiłeś:
źródło
To krótkie narzędzie, które napisałem, które zasadniczo robi to samo (pierwotnie opublikowane na Stack Overflow ):
źródło
Jeśli jesteś w Pythonie, załaduj go do zmiennej „buff” i użyj czegoś takiego:
źródło