记一次把聊天表情包转成文件再还原的故事

Posted yinkw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次把聊天表情包转成文件再还原的故事相关的知识,希望对你有一定的参考价值。

第一步转成txt: xxd xxx.gif

第二步txt文件转移到自己电脑, 略

第三步加工txt文件, 只需要中间这些二进制。 由于mac不支持grep -P命令, 改用awk命令;

由于mac下sed ‘:label;N;s/\\n/:/;t label‘ 运行结果不符合预期,改用awk命令。

tail -n2 dumpling-for-you.txt|awk ‘for(i=2;i<NF&&i<=9;i++) print $i‘|awk -v RS="" ‘gsub("\\n","");print

 技术图片

第四步开始转换!!! 编码风格诡异, 请轻拍~~

#include <iostream>
#include <fstream>
#include <stdio.h>

int main()
    FILE * in;
    FILE * out;
    if((in = fopen("xxx.hex", "rb"))==NULL)
        printf("打开输入文件失败\\n");
        return -1;
    
    if((out = fopen("yyy.gif","wb"))==NULL)
        printf("打开输出文件失败\\n");
        return -1;
    

//    fseek(in,0,SET_SEEK);
//    fseek(out,0,SEEK_END);
//    printf("移动到文件头\\n");

    char * buf=(char *)malloc(2);
    rewind(out);
    int dec_val;
    char dec_vals[100];  
    int dec_index=0;
    int count=0;
    while((fgets(buf,2,in))!=NULL && count++>=0)
        dec_val = strtol(buf, NULL, 16);   // decimal
        dec_vals[dec_index]=dec_val*16;
        if((fgets(buf,2,in)!=NULL))// 读第二个8字节
            dec_val = strtol(buf, NULL, 16);   // decimal
            dec_vals[dec_index]+=dec_val;
        else
            break;
        
        dec_index++;
        if(dec_index==100)
            printf("before fwrite, pos=%ld\\n", ftell(out));
            fseek(out, 0, SEEK_END);
            fwrite(dec_vals, 1, dec_index, out);
            dec_index=0;
            printf("after fwrite, pos=%ld\\n", ftell(out));
        
    
    fwrite(dec_vals, 1, dec_index, out);

    fclose(in);
    fclose(out);
    return 1;

 

第五步把得到的gif添加到微信表情,然后四处炫耀

小节:

1. mac上没有gdb,强行安装的gdb也非常难用,可以使用lldb

2. mac对grep、sed命令的支持与linux有些出入

以上是关于记一次把聊天表情包转成文件再还原的故事的主要内容,如果未能解决你的问题,请参考以下文章

记一次 .NET 某娱乐聊天流平台 CPU 爆高分析

记一次异机rman还原后的操作

记一次机器socket连接数持续增长的问题

记一次从Sql Server中图片二进制流还原回图片的开发过程

记一次 .NET 某纺织工厂 MES系统 API 挂死分析

记一次操蛋的rman恢复