2012-03-29 1 views
1

まず、私はCに慣れていません。私はJava、C#、C++から来ています。おそらく、この練習を実現するためにこの言語の欠陥を継承しました。私はここで、質問を以下の持っている私のコードは次のとおりです。多くの疑問は、画像ファイルの解読についてです

TAMが私の中にサイズの場所に位置して、私は最初の4つのバイトを保存する(この場合の画像)私のバイナリファイルのサイズ(unsigned long型)である
#include <stdio.h> 
#include <stdlib.h> 

void decrypt(unsigned long* v, unsigned long* k); 

const int MAX = 32; 
const long delta = 0x9e3779b9; 
long sum=0xC6EF3720; 

int main() { 
    FILE *fp; 
    FILE *destino; 
    unsigned long v[2]; 
    unsigned long k[4] = { 128, 129, 130, 131 }; 
    unsigned long tam=0; 
    char* buffer; 
    char* aux[sizeof(unsigned long)]; 
    int i; 

if ((fp = fopen("image.png", "rb")) == NULL) { 
    printf ("Error! \n "); 
    return 0; 
} 
else { 
    fread(&aux,sizeof(unsigned long),1,fp); 
    memcpy(&tam,&aux,sizeof(unsigned long)); 
    buffer = (char*)malloc(tam); 
    //fread(&buffer,1,tam,fp); 
    char *buffer2[28568]; 
    fread(&buffer2,1,28568,fp); 
    /*for(i = 0;i < tam;++i) { 
     printf("%c", ((char *)buffer2)[i]); 
    }*/ 
    for(i=4;i<tam;i+=8) { 
     memcpy(&v,&buffer2[i],8); 
     decrypt(&v,&k); 
    } 
    if ((result= fopen("image2.png", "rb")) == NULL) { 
     printf ("Error! \n "); 
     return 0; 
    } 
    else { 
     fwrite(v,sizeof(unsigned long)*2,1,result); 
     fclose (result); 
     fclose(fp); 
    } 
} 
return 0; 
} 

void decrypt(unsigned long* v, unsigned long* k) { 
int i=0; 
while(i<MAX) { 
    v[1] = v[1] -((4 << v[0])+(k[2]^v[0])+(sum^(5 >> v[0]))+k[3]); 
    v[0] = v[0] -((4 << v[1])+(k[0]^v[1])+(sum^(5 >> v[1]))+k[1]); 
    sum = sum-delta; 
    i++; 
    } 

} 

pngファイル(28568)

私はchar *バッファを動的に割り当てる必要がありますが、私がファイルから新しいフリーダを作成するときには、 "msvrct!memcpy()"を0xran私のデバッグ時にEclipseから「dom_memory_address」を入力してください。この行をコメントしています。私は28568で新しいバッファ2を手動で設定しようとしていますが、バッファ2の反復処理でascii文字の値を表示します。私のイメージを解読するために、最終結果は新しいファイルにコピーしなければならないv配列に格納されています。空のイメージpngをCで作成する方法を検索しようとしましたが、何も見つかりませんでした。私の暗号化イメージのコピーは "image2.png"と呼ばれていますが、私はこれを「クリーンな解決策」とは考えていません。なぜなら、もう一方の手はまったく動かないからです。

解読関数は、キー(配列k)を使って8バイト(64ビット)のブロックで動作する一連の操作をv配列自体に格納し、 8で8をループし、それぞれの中でvの中のbufferの値を取り出します。ループの実行後、結果はvになります。最後に新しいファイルをコピーして、最終的に画像復号化を表示します。

C言語の初心者にとっては非常に複雑な練習ですが、私が間違っていることを理解しようと夢中になっています。

誰もが私が今ではできないものを見ることができたら幸いです。

+0

サイドノート: 'malloc'を' buffer = malloc(tam * sizeof(* buffer)); 'のように使います。また、このメモリを必要としないときは 'free(buffer);で解放する必要があります。 – Shahbaz

+0

'memcpy'の後に' tam'の値を印字しようとしましたか?それはイメージのサイズに合っていますか? 'char * buffer [28568]'は 'char'の配列ではなく、ポインタの配列を取得します。これはあなたが望むものではありません。 – Shahbaz

+0

あなたのコンパイラで警告を完全に表示してみてください。 –

答えて

2

あなたはバッファの宣言に問題があると思います。私は正しいがあるべきだと思う:

FILE *fp; 
    FILE *destino; 
    unsigned long v[2]; 
    unsigned long k[4] = { 128, 129, 130, 131 }; 
    unsigned long tam=0; 
    char* buffer; 
    char aux[sizeof(unsigned long)]; // without the "*" 
    int i; 

if ((fp = fopen("image.png", "rb")) == NULL) { 
    printf ("Error! \n "); 
    return 0; 
} 
else { 
    fread(aux,sizeof(unsigned long),1,fp); 
    memcpy(&tam,aux,sizeof(unsigned long)); 
    buffer = (char*)malloc(tam); 
    //fread(buffer,1,tam,fp); // without the "&" in this case 
    char buffer2[28568]; // without the "*" 
    fread(buffer2,1,28568,fp); // or fread(buffer,1,tam,fp); 
    /*for(i = 0;i < tam;++i) { 
     printf("%c", buffer2[i]); // or buufer[i] if you change to use it again 
    }*/ 
    for(i=4;i<tam;i+=8) { 
     memcpy(v,&buffer2[i],8); 
     decrypt(v,k); 
    } 
    ... 
+0

ありがとう、それは問題です、私はポインター、感謝の配列の概念を誤解して! ループを変更するには、参照として渡さないためのバッファも必要です。 – Enot

2

私は完全にあなたが達成しようとしているのか理解していないが、一つの問題はここにある:

char* aux[sizeof(unsigned long)]; 
// ... some code ... 
fread(&aux,sizeof(unsigned long),1,fp); 

char* aux[sizeof(unsigned long)];はあなたがダブルを宣言していることを意味していることを理解しますポインタが、fread()プロトタイプは先が単一のポインタであると述べている:

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 

ので、あなたが代わりにやるべきことは次のとおりです。

char aux[sizeof(unsigned long)]; 
// ... some code ... 
fread(aux,sizeof(unsigned long),1,fp); 

複雑ではないことを複雑にしないでください!

また、コードの他の部分でこの間違いをすると、すべてを再確認する必要があります。再び:

char *buffer2[28568]; 
fread(&buffer2,1,28568,fp); 

は次のようになります。

char buffer2[28568]; 
fread(buffer2, 1, 28568, fp); 
// or: fread(buffer2, 1, sizeof(buffer2), fp); 

pointers and arraysに興味深いチュートリアルがありますが、私はあなたには、いくつかを読むことをお勧め。

+0

+1 "複雑ではないことを複雑にしないでください!" :) –

+0

したがって、彼の行動はポインタのような配列ですか?私はfreadが値をコピーするためにポインタを必要としていると思っていました。それは、あなたが言うようにして、やっている参照(&)のchar *を渡そうと思ったことです!私のバッファは動的に割り当てようとしていません...私はmallocがうまく動作していないと思います... – Enot

関連する問題