web-dev-qa-db-ja.com

ファイルをC / C ++ソースコード配列に変換するスクリプト/ツール

バイナリファイルを読み取り、C/C++ソースコード配列(ファイルの内容を表す)を出力するスクリプト/ツールが必要です。いずれかがあります?


(この質問は以前に削除されました。この質問は価値があるため、元に戻しました。Googleでこれを正確に検索し、何も見つかりませんでした。もちろん、自分でコーディングするのは簡単ですが、このような単純なスクリプトを見つけたはずです。

この質問には、あまり説明のない多くの反対票もありました。これが価値がない、または価値がないと思う理由を投票する前にコメントしてください。

この質問はまた、私が尋ねていることについて多くの混乱を引き起こしました。不明な点がある場合は、お問い合わせください。私はそれをもっと明確にする方法を本当に知りません。例については回答をご覧ください。

また(ここに質問を入れた後)、すでにいくつかの答えがあります。ここに(再び)配置/リンクしたいのは、他の誰かがこれを検索するのに役立つかもしれないからです)

69
Albert

1つの簡単なツールがあります here

#include <stdio.h>
#include <assert.h>

int main(int argc, char** argv) {
    assert(argc == 2);
    char* fn = argv[1];
    FILE* f = fopen(fn, "rb");
    printf("char a[] = {\n");
    unsigned long n = 0;
    while(!feof(f)) {
        unsigned char c;
        if(fread(&c, 1, 1, f) == 0) break;
        printf("0x%.2X,", (int)c);
        ++n;
        if(n % 10 == 0) printf("\n");
    }
    fclose(f);
    printf("};\n");
}
6
Albert

* nixのようなシステムを使用している場合、xxdツールを使用して受け入れられる答えは素晴らしいです。パス上で実行可能なpython

python -c "import sys;a=sys.argv;open(a[2],'wb').write(('const unsigned char '+a[3]+'[] = {'+','.join([hex(b) for b in open(a[1],'rb').read()])+'};').encode('utf-8'))" <binary file> <header file> <array name>

<バイナリファイル>はCヘッダーに変換するファイルの名前、<ヘッダーファイル>はヘッダーファイルの名前、<配列名>は配列に付ける名前です。

上記の1行Pythonコマンドは、次の(ほぼ読みやすい)プログラムとほぼ同じことを行いますPythonプログラム:

import sys

with open(sys.argv[2],'wb') as result_file:
  result_file.write(b'const char %s[] = {' % sys.argv[3].encode('utf-8'))
  for b in open(sys.argv[1], 'rb').read():
    result_file.write(b'0x%02X,' % b)
  result_file.write(b'};')
1
astraujums

このツールは、Cの開発者コマンドプロンプトでコンパイルします。作成された「array_name.c」ファイルの内容を表示するターミナルへの出力を生成します。一部の端末では「\ b」文字が表示される場合があることに注意してください。

    #include <stdio.h>
    #include <assert.h>

    int main(int argc, char** argv) {
    assert(argc == 2);
    char* fn = argv[1];

    // Open file passed by reference
    FILE* f = fopen(fn, "rb");
    // Opens a new file in the programs location
    FILE* fw = fopen("array_name.c","w");

    // Next two lines write the strings to the console and .c file
    printf("char array_name[] = {\n");
    fprintf(fw,"char hex_array[] = {\n");

    // Declare long integer for number of columns in the array being made
    unsigned long n = 0;

    // Loop until end of file
    while((!feof(f))){
        // Declare character that stores the bytes from hex file
        unsigned char c;

        // Ignore failed elements read
        if(fread(&c, 1, 1, f) == 0) break;
        // Prints to console and file, "0x%.2X" ensures format for all
        // read bytes is like "0x00"
        printf("0x%.2X,", (int)c);
        fprintf(fw,"0x%.2X,", (int)c);

        // Increment counter, if 20 columns have been made, begin new line
        ++n;
        if(n % 20 == 0){
            printf("\n");
            fprintf(fw,"\n");
        }
    }

    // fseek places cursor to overwrite extra "," made from previous loop
    // this is for the new .c file. Since "\b" is technically a character
    // to remove the extra "," requires overwriting it.
    fseek(fw, -1, SEEK_CUR);

    // "\b" moves cursor back one in the terminal
    printf("\b};\n");
    fprintf(fw,"};\n");
    fclose(f);
    fclose(fw);
}
0
m_h

これは、C配列ジェネレーターへのバイナリファイルですpythonソースコードは Albertの答え と同じプログラムです。

import sys
from functools import partial

if len(sys.argv) < 2:
  sys.exit('Usage: %s file' % sys.argv[0])
print("char a[] = {")
n = 0
with open(sys.argv[1], "rb") as in_file:
  for c in iter(partial(in_file.read, 1), b''):
    print("0x%02X," % ord(c), end='')
    n += 1
    if n % 16 == 0:
      print("")
print("};")
0
Hill

質問は古いですが、代替として使用できるシンプルなツールを提案させてください...

FluidというGUIベースのツールを使用できます。実際にはFLTKツールキットのインターフェースの設計に使用されますが、バイナリファイルからC++の符号なしchar配列を生成することもできます。 muquit からダウンロードします。

Fluid screenshot

0
WailenB