まず、私は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言語の初心者にとっては非常に複雑な練習ですが、私が間違っていることを理解しようと夢中になっています。
誰もが私が今ではできないものを見ることができたら幸いです。
サイドノート: 'malloc'を' buffer = malloc(tam * sizeof(* buffer)); 'のように使います。また、このメモリを必要としないときは 'free(buffer);で解放する必要があります。 – Shahbaz
'memcpy'の後に' tam'の値を印字しようとしましたか?それはイメージのサイズに合っていますか? 'char * buffer [28568]'は 'char'の配列ではなく、ポインタの配列を取得します。これはあなたが望むものではありません。 – Shahbaz
あなたのコンパイラで警告を完全に表示してみてください。 –