2017-10-05 17 views
1

コンテキスト:C - 逆変換プロセス

私はcコンバータのプロセスを逆転しようとしています。これは、元コンバータです:

#include <stdio.h> 

int main(void) { 
    FILE *f = fopen("input.bin", "rb"); 
    fseek(f, 0, SEEK_END); 
    int s = ftell(f); 
    rewind(f); 

    FILE *o = fopen("output.txt", "wb"); 

    int i; 
    for(i = 0; i < s/4; i++) { 
     unsigned int u; 
     fread(&u, sizeof(u), 1, f); 
     fprintf(o, "u32[%d] = 0x%08x;\n", i, u); 
    } 

    fclose(o); 
    fclose(f); 

    return 0; 
} 

それはoutput.txtと呼ばれる新しいファイルを作成し、このような順序でバイトに.binファイルを変換している何:

u32[0] = 0x53555441; 
u32[1] = 0x6373b848; 
u32[2] = 0x74654e65; 
u32[3] = 0x83486f53; 
u32[4] = 0x0ebe60ec; 
u32[5] = 0x48000000; 
u32[6] = 0x40245c8d; 
u32[7] = 0x24448948; 
u32[8] = 0xda894840; 
u32[9] = 0x244c8d48; 
u32[10] = 0x024fbf10; 
u32[11] = 0xc0310000; 
u32[12] = 0x482444c7; 
u32[13] = 0x74656b63; 

質問:

今、私がやっていることは、反対です。したがって、元の状態のように、上記のコンバータの出力バイトを.binファイルに再度変換しようとしています。

私はこれを試してみましたが、私はループ部分にこだわっている:

#include <stdio.h> 

int main(void) { 
    FILE *f = fopen("loader.txt", "rb"); // INPUT 
    fseek(f, 0, SEEK_END); 
    int s = ftell(f); 
    rewind(f); 

    FILE *o = fopen("loader.bin", "wb"); // OUTPUT 

    int i; 
    for(i = 0; i < s/4; i++) { 
     // grab u32 bytes from loader.txt and convert into a .bin 
    } 

    fclose(o); 
    fclose(f); 

    return 0; 
} 

誰もがこれで私を助けることはできますか?驚くほど憂鬱になるだろう。


編集ここ

#include <stdio.h> 

int main(void) { 
    FILE *f = fopen("loader.txt", "rb"); // INPUT 
    rewind(f); 

    FILE *o = fopen("loader.bin", "wb"); // OUTPUT 

    int i; 
    for(i = 0; i < s/4; i++) { 
     fgets(f); 
    sscanf(f); 
    } 

    fclose(o); 
    fclose(f); 

    return 0; 
} 
+0

解決策があった以前のこれと同様の質問を見たことがありますが、今見つけられません... –

+0

@ChrisTurnerそれも説明していないよく、アカウントがロックされてdownvotesのために後で質問を投稿できませんでした。 – Mitch

+0

変数名に意味のある名前を付けてください。一文字変数は誰にも役に立ちません。 –

答えて

0

仕事をするように見えるコードです:

u32[0] = 0x53555441; 
u32[1] = 0x6373b848; 
u32[2] = 0x74654e65; 
u32[3] = 0x83486f53; 
u32[4] = 0x0ebe60ec; 
u32[5] = 0x48000000; 
u32[6] = 0x40245c8d; 
u32[7] = 0x24448948; 
u32[8] = 0xda894840; 
u32[9] = 0x244c8d48; 
u32[10] = 0x024fbf10; 
u32[11] = 0xc0310000; 
u32[12] = 0x482444c7; 
u32[13] = 0x74656b63; 
:質問( loader.txt)からのサンプルデータに実行すると

#include <stdio.h> 

int main(void) 
{ 
    const char i_file[] = "loader.txt"; 
    const char o_file[] = "loader.bin"; 
    FILE *f = fopen(i_file, "rb"); // INPUT 
    if (f == 0) 
    { 
     fprintf(stderr, "failed to open file '%s' for reading\n", i_file); 
     return 1; 
    } 

    FILE *o = fopen(o_file, "wb"); // OUTPUT 
    if (o == 0) 
    { 
     fprintf(stderr, "failed to open file '%s' for writing\n", o_file); 
     return 1; 
    } 

    char line[1024]; 
    int lineno = 0; 
    while (fgets(line, sizeof(line), f) != 0) 
    { 
     int u32num; 
     unsigned int value; 
     lineno++; 
     if (line[0] == '\n') 
      continue; // Blank lines ignored 
     if (sscanf(line, "u32[%d] = %x", &u32num, &value) == 2) 
     { 
      fseek(o, u32num * sizeof(value), SEEK_SET); 
      if (fwrite(&value, sizeof(value), 1, o) != 1) 
      { 
       fprintf(stderr, "Failed to write 0x%.8X to offset %d in %s\n", 
         value, u32num, o_file); 
       break; 
      } 
     } 
     else 
     { 
      fprintf(stderr, "Input line %d in %s is mal-formatted: %s", lineno, i_file, line); 
      break; 
     } 
    } 

    fclose(o); 
    fclose(f); 

    return 0; 
} 

出力ファイル( loader.bin)は次のとおりです。odxは、単に自家製進ダンププログラムです

$ odx loader.bin 
0x0000: 41 54 55 53 48 B8 73 63 65 4E 65 74 53 6F 48 83 ATUSH.sceNetSoH. 
0x0010: EC 60 BE 0E 00 00 00 48 8D 5C 24 40 48 89 44 24 .`.....H.\[email protected]$ 
0x0020: 40 48 89 DA 48 8D 4C 24 10 BF 4F 02 00 00 31 C0 @H..H.L$..O...1. 
0x0030: C7 44 24 48 63 6B 65 74       .D$Hcket 
0x0038: 
$ 

は(あなたが)同様の結果を達成するためにodまたはxxdまたは他のプログラムを使用することができます。そのまま元の変換コードを撮影する(それは私の厳しいコンパイルオプションの下にきれいにコンパイル - よくやった)、およびinput.binloader.binをコピーすると、出力は次のとおりです。

u32[0] = 0x53555441; 
u32[1] = 0x6373b848; 
u32[2] = 0x74654e65; 
u32[3] = 0x83486f53; 
u32[4] = 0x0ebe60ec; 
u32[5] = 0x48000000; 
u32[6] = 0x40245c8d; 
u32[7] = 0x24448948; 
u32[8] = 0xda894840; 
u32[9] = 0x244c8d48; 
u32[10] = 0x024fbf10; 
u32[11] = 0xc0310000; 
u32[12] = 0x482444c7; 
u32[13] = 0x74656b63; 

これは、元の入力ファイルと同じなので、ペアプログラムは、データをラウンドトリップすることができます(2つのプログラムを順番に実行し、元の入力として保存されたデータを最終出力として取得します)。このコードは、4バイトの倍数ではない長さのバイナリファイルでテストされていないことに注意してください。そこに心配する問題があります。

+0

シンプルに素晴らしい。どうもありがとう! – Mitch

関連する問題