Eu tenho um arquivo binário que gostaria de incluir no meu código-fonte C (temporariamente, para fins de teste), então gostaria de obter o conteúdo do arquivo como uma string C, algo como isto:
\x01\x02\x03\x04
Isso é possível, talvez usando os utilitários od
ou hexdump
? Embora não seja necessário, se a string puder quebrar a linha seguinte a cada 16 bytes de entrada e incluir aspas duplas no início e no final de cada linha, isso seria ainda melhor!
Estou ciente de que a string terá nulos incorporados ( \x00
), portanto, precisarei especificar o comprimento da string no código, para impedir que esses bytes terminem a string com antecedência.
Respostas:
Você quase pode fazer o que quiser
hexdump
, mas não consigo descobrir como obter aspas e barras invertidas na string de formato. Então, eu faço um pouco de pós-processamento comsed
. Como bônus, também recuei cada linha em 4 espaços. :)Editar
Como Cengiz Can apontou, a linha de comando acima não lida bem com linhas de dados curtas. Então, aqui está uma nova versão aprimorada:
Como Malvineous menciona nos comentários, também precisamos passar a
-v
opção detalhadahexdump
para impedir que abrevie longas execuções de bytes idênticos a*
.fonte
-v
opçãohexdump
, caso contrário, longas execuções do mesmo byte de entrada causam as linhas de saída que dizem"*"
.xxd
tem um modo para isso. A opção-i
/--include
:Você pode despejar isso em um arquivo a ser
#include
d e acessar apenasfoo
como qualquer outra matriz de caracteres (ou vinculá-lo). Ele também inclui uma declaração do comprimento da matriz.A saída é agrupada em 80 bytes e parece essencialmente com o que você pode escrever à mão:
xxd
é, de certa forma, parte davim
distribuição, então você provavelmente já a possui. Caso contrário, é onde você o obtém - você também pode criar a ferramenta por conta própria, fora davim
fonte.fonte
objcopy
seria melhorobjcopy
permitiria ao OP vincular os dados binários ao executável como um arquivo de objeto, o que é útil, mas não é exatamente o que está sendo solicitado aqui.foo
/foo_len
aqui, e não estaria desperdiçando muito espaço de armazenamento. Estou convencido de que o OP estaria em melhor situaçãoobjcopy
e que atenda às suas exigências.objcopy
é bom quando está por perto, mas não é portátil e a saída ainda menos. Certamente pode fazer parte de uma boa solução permanente, mas essa não é a questão aqui.xxd
é bom, mas o resultado é altamente detalhado e ocupa muito espaço de armazenamento.Você pode conseguir praticamente a mesma coisa usando
objcopy
; por exemploEm seguida, vincule
foo.o
ao seu programa e simplesmente use os seguintes símbolos:Isso não é uma literal de cadeia de caracteres, mas é essencialmente a mesma coisa que um literal de cadeia de caracteres se transforma durante a compilação (considere que os literais de cadeia de fato não existem de fato no tempo de execução; na verdade, nenhuma das outras respostas realmente fornece uma cadeia de caracteres literal mesmo em tempo de compilação) e pode ser acessado basicamente da mesma maneira:
A desvantagem é que você precisa especificar sua arquitetura de destino para tornar o arquivo de objeto compatível, e isso pode não ser trivial em seu sistema de construção.
fonte
Deve ser exatamente o que você pediu:
fonte
Este é um pequeno utilitário que escrevi que essencialmente faz a mesma coisa (originalmente publicado no Stack Overflow ):
fonte
Se você gosta de python, carregue-o em uma variável "buff" e use algo como isto:
fonte