关于用c解密图像文件的许多疑问 首先,我对C不是很熟悉,我来自java,C++,C++…为了实现这种实践,我可能继承了这种语言的缺陷,我有以下问题,这是我的代码: #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++; } } #包括 #包括 无效解密(无符号长*v,无符号长*k); 常数int MAX=32; 常数长增量=0x9e3779b9; 长和=0xC6EF3720; int main(){ 文件*fp; 文件*destino; 无符号长v[2]; 无符号长k[4]={128、129、130、131}; 无符号长tam=0; 字符*缓冲区; char*aux[sizeof(无符号长)]; int i; if((fp=fopen(“image.png”,“rb”))==NULL){ printf(“错误!\n”); 返回0; } 否则{ fread(&aux,sizeof(无符号长),1,fp); memcpy(&tam,&aux,sizeof(无符号长型)); 缓冲区=(字符*)malloc(tam); //fread(缓冲区,1,tam,fp); char*buffer2[28568]; fread(和buffer2,128568,fp); /*对于(i=0;i
其中tam是我的二进制文件(本例中为图像)的大小,其中我存储了前4个字节(无符号长),其中位于我的png文件(28568)中的大小 当我创建我的char*缓冲区时,我必须使用malloc动态分配,但是当我从我的文件中创建一个新的fread时,我得到一个“无可用源”msvrct!0xrandom\u memory\u地址处的memcpy()“在Eclipse中,当我调试时,我注释了这一行,并尝试手动将新的buffer2设置为28568作为数组的大小,显然有效,使buffer2重复打印ascii字符值,但当我调用decrypt对图像进行解密时,最终结果存储在v数组中,我必须将其复制到新文件中,我试图搜索如何在C中生成一个空图像png,但没有找到任何东西,所以我创建了一个加密图像的副本,称之为“image2.png”,但我认为这不是“干净的解决方案”,因为另一方面根本不起作用 有关此练习的更多解释,只需假设decrypt函数使用8字节(64位)的块,这些块通过密钥(数组k)进行一系列操作,存储在v数组本身中,穿过循环8 in 8并在每个循环中检索缓冲区in v的值,在循环执行之后,我们在v中得到了结果,只剩下复制到一个新文件中,在这个文件中最终显示了图像解密 对于所有C语言的新手来说,这是一个非常复杂的练习,它让我疯狂地试图找出我做错了什么关于用c解密图像文件的许多疑问 首先,我对C不是很熟悉,我来自java,C++,C++…为了实现这种实践,我可能继承了这种语言的缺陷,我有以下问题,这是我的代码: #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++; } } #包括 #包括 无效解密(无符号长*v,无符号长*k); 常数int MAX=32; 常数长增量=0x9e3779b9; 长和=0xC6EF3720; int main(){ 文件*fp; 文件*destino; 无符号长v[2]; 无符号长k[4]={128、129、130、131}; 无符号长tam=0; 字符*缓冲区; char*aux[sizeof(无符号长)]; int i; if((fp=fopen(“image.png”,“rb”))==NULL){ printf(“错误!\n”); 返回0; } 否则{ fread(&aux,sizeof(无符号长),1,fp); memcpy(&tam,&aux,sizeof(无符号长型)); 缓冲区=(字符*)malloc(tam); //fread(缓冲区,1,tam,fp); char*buffer2[28568]; fread(和buffer2,128568,fp); /*对于(i=0;i,c,image,fwrite,encryption,fread,C,Image,Fwrite,Encryption,Fread,其中tam是我的二进制文件(本例中为图像)的大小,其中我存储了前4个字节(无符号长),其中位于我的png文件(28568)中的大小 当我创建我的char*缓冲区时,我必须使用malloc动态分配,但是当我从我的文件中创建一个新的fread时,我得到一个“无可用源”msvrct!0xrandom\u memory\u地址处的memcpy()“在Eclipse中,当我调试时,我注释了这一行,并尝试手动将新的buffer2设置为28568作为数组的大小,显然有效,使buffer2重复打印ascii字符
我希望任何人都能看到我目前无法看到的内容。我认为缓冲区的声明存在问题。我认为正确的答案应该是:
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);
}
...
char buffer2[28568];
fread(buffer2, 1, 28568, fp);
// or: fread(buffer2, 1, sizeof(buffer2), fp);
文件*fp;
文件*destino;
无符号长v[2];
无符号长k[4]={128、129、130、131};
无符号长tam=0;
字符*缓冲区;
字符辅助[sizeof(无符号长)];//没有“*”
int i;
if((fp=fopen(“image.png”,“rb”))==NULL){
printf(“错误!\n”);
返回0;
}
否则{
fread(aux,sizeof(无符号长),1,fp);
memcpy(&tam,aux,sizeof(无符号长型));
缓冲区=(字符*)malloc(tam);
//fread(buffer,1,tam,fp);//在本例中不带“&”
char buffer2[28568];//不带“*”
fread(buffer2,128568,fp);//或fread(buffer,1,tam,fp);
/*对于(i=0;i 对于(i=4;i我认为您对缓冲区的声明有问题。我认为正确的答案应该是:
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);
}
...
char buffer2[28568];
fread(buffer2, 1, 28568, fp);
// or: fread(buffer2, 1, sizeof(buffer2), fp);
文件*fp;
文件*destino;
无符号长v[2];
无符号长k[4]={128、129、130、131};
无符号长tam=0;
字符*缓冲区;
char aux[sizeof(unsigned long)];//不带“*”
int i;
if((fp=fopen(“image.png”,“rb”))==NULL){
printf(“错误!\n”);
返回0;
}
否则{
fread(aux,sizeof(无符号长),1,fp);
memcpy(&tam,aux,sizeof(无符号长型));
缓冲区=(字符*)malloc(tam);
//fread(buffer,1,tam,fp);//在本例中不带“&”
char buffer2[28568];//不带“*”
fread(buffer2,128568,fp);//或fread(buffer,1,tam,fp);
/*对于(i=0;i 对于(i=4;i我不完全理解您试图实现的目标,但这里有一个问题:
char* aux[sizeof(unsigned long)];
// ... some code ...
fread(&aux,sizeof(unsigned long),1,fp);
请理解char*aux[sizeof(unsigned long)];
表示您正在声明一个双指针,但fread()
prototype表示目标是一个单指针:
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);
应该是:
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);
}
...
char buffer2[28568];
fread(buffer2, 1, 28568, fp);
// or: fread(buffer2, 1, sizeof(buffer2), fp);
上有一些有趣的教程,我建议您阅读一些。我不完全理解您试图实现的目标,但有一个问题是:
char* aux[sizeof(unsigned long)];
// ... some code ...
fread(&aux,sizeof(unsigned long),1,fp);
请理解char*aux[sizeof(unsigned long)];
表示您正在声明一个双指针,但fread()
prototype表示目标是一个单指针:
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);
应该是:
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);
}
...
char buffer2[28568];
fread(buffer2, 1, 28568, fp);
// or: fread(buffer2, 1, sizeof(buffer2), fp);
有一些有趣的教程,我建议你读一些。旁注:像这样使用malloc
:buffer=malloc(tam*sizeof(*buffer));
。另外,你需要用free(buffer)释放内存当你不需要它时。你试过在memcpy
之后打印tam
的值吗?这与图像的大小匹配吗?char*buffer[28568]
获取指针数组,而不是字符数组,因此这不是您想要的。请尝试在编译器上一直打开警告。是否可以使用字符*缓冲区