J'ai un fichier binaire que je voudrais inclure dans mon code source C (temporairement, à des fins de test) afin que je souhaite obtenir le contenu du fichier sous forme de chaîne C, quelque chose comme ceci:
\x01\x02\x03\x04
Est-ce possible, peut-être en utilisant les utilitaires od
ou hexdump
? Bien que cela ne soit pas nécessaire, si la chaîne peut passer à la ligne suivante tous les 16 octets en entrée et inclure des guillemets doubles au début et à la fin de chaque ligne, ce serait encore mieux!
Je suis conscient que la chaîne comportera nulls ( \x00
). J'aurai donc besoin de spécifier la longueur de la chaîne dans le code pour empêcher ces octets de terminer la chaîne plus tôt.
Réponses:
Vous pouvez presque faire ce que vous voulez
hexdump
, mais je ne vois pas comment insérer des guillemets et des barres obliques inverses dans la chaîne de format. Je fais donc un peu de post-traitement avecsed
. En prime, j'ai également mis en retrait chaque ligne de 4 espaces. :)modifier
Comme Cengiz Can l'a fait remarquer, la ligne de commande ci-dessus ne convient pas aux lignes de données courtes. Alors, voici une nouvelle version améliorée:
Comme Malvineous le mentionne dans les commentaires, nous devons également passer l’
-v
option verbose afinhexdump
de l’empêcher de raccourcir les longues séries d’octets identiques*
.la source
-v
option àhexdump
, sinon les longs lancements du même octet d'entrée causent des lignes de sortie qui disent"*"
.xxd
a un mode pour cela. L' option-i
/--include
va:Vous pouvez sauvegarder cela dans un fichier pour qu'il soit
#include
d, puis accéderfoo
comme n'importe quel autre tableau de caractères (ou le lier). Il comprend également une déclaration de la longueur du tableau.La sortie est encapsulée à 80 octets et ressemble essentiellement à ce que vous pourriez écrire à la main:
xxd
étrangement, fait partie de lavim
distribution, donc vous l’avez probablement déjà. Sinon, c'est là que vous l'obtenez - vous pouvez également créer l'outil à partir de lavim
source.la source
objcopy
serait mieuxobjcopy
permettrait à OP de lier les données binaires à l'exécutable sous forme de fichier objet, ce qui est utile mais ne correspond pas exactement à ce qui est demandé ici.foo
/foo_len
ici, et vous ne gaspilleriez pas énormément d'espace de stockage. Je suis convaincu que le PO serait mieux avecobjcopy
et que cela répond à ses besoins.objcopy
est bien quand il est autour, mais ce n'est pas portable et la sortie encore moins. Cela peut certainement faire partie d'une bonne solution permanente, mais ce n'est pas la question.xxd
est bon mais le résultat est très prolixe et prend beaucoup d’espace de stockage.Vous pouvez réaliser pratiquement la même chose en utilisant
objcopy
; par exempleEnsuite, créez un lien
foo.o
vers votre programme et utilisez simplement les symboles suivants:Ce n'est pas un littéral de chaîne, mais c'est essentiellement la même chose que ce que devient un littéral de chaîne pendant la compilation (considérez que les littéraux de chaîne n'existent pas en réalité au moment de l'exécution; en fait, aucune des autres réponses ne vous donne réellement un littéral de chaîne. même au moment de la compilation) et peut être consulté en grande partie de la même manière:
L'inconvénient est que vous devez spécifier votre architecture cible pour rendre le fichier objet compatible, ce qui peut ne pas être trivial dans votre système de construction.
la source
Devrait être exactement ce que vous avez demandé:
la source
Voici un petit utilitaire que j'ai écrit qui fait essentiellement la même chose (posté à l'origine sur Stack Overflow ):
la source
Si vous êtes en python, chargez-le dans une variable "buff" et utilisez quelque chose comme ça:
la source