Linux C语言实现把微信Image的dat文件转成png图片

cpp 复制代码
#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;
}

相关的桌面程序在我的资源列表里面可以下载

相关推荐
Android系统攻城狮4 小时前
Linux Gstreamer深度解析之gst_audio_ring_buffer_delay调用流程与实战(七十二)
linux·运维·服务器·gstreamer音视频·音视频进阶
快乐的韭菜根根5 小时前
ubuntu 安装slurm并配置
linux·运维·ubuntu
Navigator_Z5 小时前
LeetCode //C - 1289. Minimum Falling Path Sum II
c语言·算法·leetcode
himobrinehacken6 小时前
取模运算的汇编奥秘揭秘
c语言·安全
倒头就睡的小比特7 小时前
Linux基础指令3
linux·服务器
梦帮科技7 小时前
Kali Linux Scapy 畸形报文构造学——深度解剖非法 TCP Flags 与反常序列号
linux·爬虫·神经网络·算法·数学建模·系统架构·模拟退火算法
半杯咖啡半行码8 小时前
Linux 驱动开发入门:内核模块编程基础
linux·服务器·网络
别动我齐刘海9 小时前
Linux 系统调试学习2
linux·运维·c++·人工智能·学习·机器学习·机器人
青岚_Nox9 小时前
C语言实战:带你手写一个带"计时功能"的猜数字小游戏
c语言
龙虾电话9 小时前
语音机器人打断不进去:VAD 双阈值迟滞里一个共用的 bool,和它引发的连锁误判
linux