#include <stdio.h>
#include <dirent.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_SIZE 1024
void open_and_display_file(const char *filepath, const char *dir)
{
unsigned char Decode = 0;
static int image_id = 0;
unsigned char imagePath[PATH_MAX] = {0};
unsigned char buffer[BUFFER_SIZE] = {0};
FILE *imageFp = NULL;
FILE *file = NULL;
int read_len = 0;
int write_len = 0;
sprintf(imagePath, "%s/%d.png", dir, image_id);
image_id++;
file = fopen(filepath, "r");
if (file == NULL)
{
perror("无法打开文件:");
return;
}
imageFp = fopen(imagePath, "wb+");
if (imageFp == NULL)
{
perror("无法打开文件:");
return;
}
ftruncate(fileno(imageFp), 0);
fread(buffer, 1, 2, file);
int mData1 = buffer[0] ^ 0xFF;
int mData2 = buffer[1] ^ 0xD8;
printf("mData1 %X mData2 %x\n", mData1, mData2);
if (mData1 == mData2)
{
Decode = mData1;
printf("Decode JPEG found %X %x %x\n", buffer[0], buffer[1], Decode);
}
else
{
printf("Decode JPEG not found %X %x %x\n", buffer[0], buffer[1], Decode);
mData1 = buffer[0] ^ 0x89;
mData2 = buffer[1] ^ 0x50;
if (mData1 == mData2)
{
Decode = mData1;
printf("Decode PNG found %X %x %x\n", buffer[0], buffer[1], Decode);
}else{
printf("Decode PNG not found %X %x %x\n", buffer[0], buffer[1], Decode);
}
}
fseek(file, 0, SEEK_SET);
while (!feof(file))
{
read_len = fread(buffer, 1, BUFFER_SIZE, file);
for (int i = 0; i < read_len; i++)
{
buffer[i] ^= Decode;
}
write_len = fwrite(buffer, 1, read_len, imageFp);
}
fclose(file);
fclose(imageFp);
}
int main(int argc, char *argv[])
{
if (argc != 2)
{
fprintf(stderr, "用法: %s 目录路径\n", argv[0]);
return 1;
}
const char *directory_path = argv[1];
DIR *dir;
struct dirent *entry;
if ((dir = opendir(directory_path)) == NULL)
{
perror("无法打开目录:");
return 1;
}
while ((entry = readdir(dir)) != NULL)
{
if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0)
{
char filepath[PATH_MAX];
snprintf(filepath, PATH_MAX, "%s/%s", directory_path, entry->d_name);
open_and_display_file(filepath, directory_path);
}
}
closedir(dir);
return 0;
}
相关的桌面程序在我的资源列表里面可以下载