XM的小窝


 

[小练习]基于C写的简单图种生成器

图种是啥?

图种一种采用特殊方式将图片文件(如jpg格式)与压缩文件结合起来的文件。该文件一般输出为jpg图片文件,可以正常预览图片;当有人将该图片下载到本地后,可以通过修改文件的后缀,将.jpg改为.zip,并用winrar/7zip查看得到数据。由于这种方式有利于某些网友(老司机)传播种子文件,故称为图种,又叫作内涵图(摘自百度百科)。

图种的生成方式有很多,但其原理永远都是那一个,就是接头霸王

以下为萌娘百科解释:
大部分图片格式都是元数据格式文件,数据是按照特定格式的字节流(即:区块)来分区保存,图片解释程序只会处理符合格式的区块字节流读取和处理图像数据,不符合的会被视为损坏的区块处理。
Rar压缩文件以rar特有的魔术字节流(ASCII码为Rar!)作为其文件格式的读取开头,这个魔术字并不需要一定在文件字节流的起始。

打个比方,一张图片通常是以字节流的形式来保存的,而压缩软件通常会忽略掉字节流,直接定位到压缩文件的文件头部分,这就导致了这样的现象:扩展名改成图片格式就变成了图片,改成压缩文件就便乘小姐姐

搞清楚原理之后,我们就可以开始愉快的写代码环节了

虽然没啥技术含量,但的确能用(滑稽)?
已知bug:
        文件不能大于1.5G(雾)
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
/*
以下是没有卵用的密码验证函数
void passwd_check()
{
    int passwd=0;
    while(passwd!=10010)
    {
        printf("请输入密码:");
        scanf("%d",&passwd);
        if(passwd!=10010)
             printf("密码错误,请重新输入\n");
    }
}
*/
int main()
{
    //passwd_check();
    FILE *f_pic,*f_zip;
    char pic[200],zip[200],*buf;
    int zip_file_end,flag_fread,flag_fwrite;
    system("color 0d");system("title Powered by 小米智能");
    printf("图片文件(直接拖入就可以,不带引号,不带空格:");
    scanf("%s",pic);
    if(!(f_pic=fopen(pic,"ab")))
        {
            printf("打开图片文件失败!");
            Sleep(3000);
            exit(-1);
        }
    fflush(stdin);
    printf("压缩文件:");
    scanf("%s",zip);
    if(!(f_zip=fopen(zip,"rb")))
        {
            printf("打开压缩文件失败!");
            Sleep(3000);
            exit(-2);
        }
    fflush(stdin);
    fseek(f_zip,0,SEEK_END);              //文件指针移向文件尾
    zip_file_end=ftell(f_zip);            //获取文件大小
    fseek(f_zip,0,SEEK_SET);              //返回文件起始处
    buf=(char*)malloc(zip_file_end);
    flag_fread=fread(buf,1,zip_file_end,f_zip);   //读取文件到内存(bug出处)
    flag_fwrite=fwrite(buf,1,zip_file_end,f_pic); //连接图片与压缩包
    if(flag_fread==flag_fwrite&&flag_fwrite==zip_file_end&&flag_fread==zip_file_end)
        printf("成功啦~\n");
    else
       printf("文件太大或其他错误,处理失败\n");
    fclose(f_zip);
    fclose(f_pic);
    free(buf);
    system("pause");
}

下面是效果展示:

GjQmg1.md.png GjQe3R.png GjQKu6.png GjQnjx.md.png

以后会更新图种分离代码(有生之年)看我啥时候想起来吧(即答)?

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注