バイナリファイルをC / C ++文字列リテラルにダンプする方法は?

バイナリファイルをC / C ++文字列リテラルにダンプする方法は?

私のCソースコードに(一時的にテスト目的で)バイナリファイルを含めたいので、ファイルの内容を次のC文字列にインポートしたいと思います。

\x01\x02\x03\x04

odまたはユーティリティを使用してこれは可能ですかhexdump?必須ではありませんが、文字列が16個の入力バイトごとに次の行に折り返され、各行の先頭と末尾に二重引用符を含めることができると思います。

文字列にNULL値が含まれて\x00いることがわかっているため、これらのバイトが文字列を早期に終了しないようにするには、コードで文字列の長さを指定する必要があります。

ベストアンサー1

xxdこれを行うパターンがあります。-i/オプションは--include次のことを行います。

Cの出力にはファイルスタイルが含まれています。 xxdがstdinから読み取らない限り、完全な静的配列定義(入力ファイル名にちなんで命名)を作成します。

他の文字配列と同様に、書き込み用にファイルにダンプしてから#includeアクセスfoo(またはリンク)できます。また、配列長宣言も含まれます。

出力は80バイトに圧縮され、デフォルトで直接作成したものと同じです。

$ xxd --include foo
unsigned char foo[] = {
  0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64,
  0x21, 0x0a, 0x0a, 0x59, 0x6f, 0x75, 0x27, 0x72, 0x65, 0x20, 0x76, 0x65,
  0x72, 0x79, 0x20, 0x63, 0x75, 0x72, 0x69, 0x6f, 0x75, 0x73, 0x21, 0x20,
  0x57, 0x65, 0x6c, 0x6c, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x2e, 0x0a
};
unsigned int foo_len = 47;

xxdやや奇妙なことに、これはvimディストリビューションの一部なので、すでに持っているでしょう。そうでなければそこから得ることができます。ソースから直接ツールをビルドすることもできますvim

おすすめ記事