石器时代LA官方

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3535|回复: 3

研究下大面积的自动客户端补丁导入 加密函数

[复制链接]

9979

主题

1万

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
29439
石币
18832
发表于 2013-9-14 18:22:26 | 显示全部楼层 |阅读模式

unsigned char *encoder( unsigned char *buf, unsigned char **disBuf,
        unsigned int width, unsigned int height, unsigned int *len, int cmpFlag )
{
        unsigned char *wBuf, *ewBuf, *eBuf;
        unsigned char *wBuf1, *buf1;
        unsigned char *wBuf2, *buf2;
        unsigned char idx;
        int flag = 1;
        RD_HEADER *header;
        unsigned int cnt, cnt2;
        unsigned char repData;
        int mode;
        unsigned int l, el;
        int addWBuf;

        //内存+图像大小分确保头
        if( *disBuf == NULL )
        {
                if( (wBuf = (unsigned char *)malloc( width * height + sizeof( RD_HEADER ) )) == NULL )
                {
                        return NULL;
                }
                *disBuf = wBuf;
        }
        else
        {
                wBuf = *disBuf;
        }

        if( cmpFlag )
        {
                flag = 1;
        }
        else
        {
                flag = 0;
        }

        // バッファのエンド 缓冲的结束地址
        eBuf = buf + width * height;
        ewBuf = wBuf + width * height + sizeof( RD_HEADER );

        wBuf1 = wBuf+sizeof( RD_HEADER );
        buf1 = buf;
        while( cmpFlag )
        {
                // 終了チェッ
                if( buf1 >= eBuf )
                {
                        // 読み込みデータが無くなった
                        flag = 1;
                        break;
                }
                if( wBuf1 >= ewBuf )
                {
                        // 圧縮データサイズが元データサイズを超えたので終了
                        flag = 0;
                        break;
                }

                // ゼロの圧縮(2個以上なら圧縮)
                if( *buf1 == 0 && *(buf1+1) == 0 )
                {
                        // まずは圧縮個数を数える
                        idx = BIT_CMP | BIT_ZERO;
                        cnt = 2;
                        buf1 += 2;
                        while( buf1 < eBuf && cnt < 0xfffff )
                        {
                                if( *buf1 != 0 )
                                {
                                        break;
                                }
                                buf1++;
                                cnt++;
                        }
                        // 0の連続が16個未満の時
                        if( cnt <= 0xf )
                        {
                                addWBuf = 0;
                        }
                        else
                        // 16個以上4096未満の時
                        if( cnt <= 0xfff )
                        {
                                addWBuf = 1;
                        }
                        // 4096以上の時
                        else
                        {
                                addWBuf = 2;
                        }

                        // 圧縮データサイズが元データサイズを超えたので終了
                        if( wBuf1+addWBuf >= ewBuf )
                        {
                                flag = 0;
                                break;
                        }

                        // 圧縮データを書き込む
                        if( addWBuf == 0 )
                        {
                                idx |= (cnt & 0x0f);
                                *wBuf1++ = idx;
                                continue;
                        }
                        else
                        if( addWBuf == 1 )
                        {
                                idx |= (BIT_REP_LARG | ((cnt >> 8) & 0xf));
                                *wBuf1++ = idx;
                                *wBuf1++ = (unsigned char)(cnt & 0xff);
                                continue;
                        }
                        else
                        {
                                idx |= (BIT_REP_LARG2 | ((cnt >> 16) & 0xf));
                                *wBuf1++ = idx;
                                *wBuf1++ = (unsigned char)((cnt >> 8) & 0xff);
                                *wBuf1++ = (unsigned char)(cnt & 0xff);
                                continue;
                        }
                }
#if 1
                // ゼロ以外で圧縮(3個以上なら圧縮)
                if( *buf1 == *(buf1+1) && *buf1 == *(buf1+2) )
                {
                        repData = *buf1;
                        idx = BIT_CMP;
                        cnt = 3;
                        buf1 += 3;
                        while( buf1 < eBuf && cnt < 0xfffff )
                        {
                                if( *buf1 != repData )
                                {
                                        break;
                                }
                                buf1++;
                                cnt++;
                        }

                        // 連続データが16個未満の時
                        if( cnt <= 0xf )
                        {
                                addWBuf = 1;
                        }
                        else
                        // 16個以上4096未満の時
                        if( cnt <= 0xfff )
                        {
                                addWBuf = 2;
                        }
                        // 4096以上の時
                        else
                        {
                                addWBuf = 3;
                        }

                        // 圧縮データサイズが元データサイズを超えたので終了
                        if( wBuf1+addWBuf >= ewBuf )
                        {
                                flag = 0;
                                break;
                        }

                        // 圧縮データを書き込む
                        if( addWBuf == 1 )
                        {
                                idx |= (cnt & 0x0f);
                                *wBuf1++ = idx;
                                *wBuf1++ = repData;
                                continue;
                        }
                        else
                        if( addWBuf == 2 )
                        {
                                idx |= (BIT_REP_LARG | ((cnt >> 8) & 0xf));
                                *wBuf1++ = idx;
                                *wBuf1++ = repData;
                                *wBuf1++ = (unsigned char)(cnt & 0xff);
                                continue;
                        }
                        else
                        {
                                idx |= (BIT_REP_LARG2 | ((cnt >> 16) & 0xf));
                                *wBuf1++ = idx;
                                *wBuf1++ = repData;
                                *wBuf1++ = (unsigned char)((cnt >> 8) & 0xff);
                                *wBuf1++ = (unsigned char)(cnt & 0xff);
                                continue;
                        }
                }
#endif

                // 圧縮無し
                // 最初はどこまで圧縮しないかを見るだけ
                idx = 0;
                cnt2 = 0;
                buf2 = buf1;
                wBuf2 = wBuf1;
                while( 1 )
                {
                        // 終了チェック
                        if( buf2 >= eBuf                // 読み込むデータが無いので終了
                         || cnt2 >= 0xfff )                // 一回に扱えるデータ長を超えたので次へ
                        {
                                mode = 0;
                                break;
                        }
                        if( wBuf2 >= ewBuf )
                        {
                                // 圧縮データサイズが元データサイズを超えたので終了
                                mode = 1;
                                break;
                        }
                        // データの最後から4番目以前なら圧縮データがあるか確認する
                        // それ以外は無圧縮として扱う
                        if( buf2+2 < eBuf )
                        {
                                if( *buf2 == 0 && *(buf2+1) == 0 )
                                {
                                        mode = 0;
                                        break;
                                }
                                if( *buf2 != 0 && *buf2 == *(buf2+1) && *(buf2+1) == *(buf2+2) )
                                {
                                        mode = 0;
                                        break;
                                }

                        }
                        buf2++;
                        wBuf2++;
                        cnt2++;
                }

                if( cnt2 <= 0xf )
                {
                        addWBuf = 0;
                }
                else
                if( cnt2 <= 0xfff )
                {
                        addWBuf = 1;
                }
                else
                {
                        addWBuf = 2;
                }

                if( mode == 1
                 || wBuf2+addWBuf >= ewBuf )
                {
                        // 圧縮データサイズが元データサイズを超えたので終了
                        flag = 0;
                        break;
                }

                // 非圧縮データの数がわかったので転送
                if( addWBuf == 0 )
                {
                        idx = (cnt2 & 0xf);
                        *wBuf1++ = idx;
                }
                else
                if( addWBuf == 1 )
                {
                        idx = BIT_REP_LARG | ((cnt2 >> 8) & 0xf);
                        *wBuf1++ = idx;
                        *wBuf1++ = (unsigned char)(cnt2 & 0xff);
                }
                else
                {
                        idx = BIT_REP_LARG2 | ((cnt2 >> 16) & 0xf);
                        *wBuf1++ = idx;
                        *wBuf1++ = (unsigned char)((cnt2 >> 8) & 0xff);
                        *wBuf1++ = (unsigned char)(cnt2 & 0xff);
                }
                for( cnt = 0; cnt < cnt2; cnt++ )
                {
                        *wBuf1++ = *buf1++;
                }
        }


        header = (RD_HEADER *)wBuf;
        header->id[0] = 'R';
        header->id[1] = 'D';
        header->width = width;
        header->height = height;

        if( flag == 1 )
        {
                header->compressFlag = 1;
                header->size = wBuf1 - wBuf;
                l = header->size;
        }
        else
        // 圧縮せずにコピー
        {
                header->compressFlag = 0;
                header->size = (int)wBuf + width * height + sizeof( RD_HEADER );
                wBuf1 = wBuf + sizeof( RD_HEADER );
                buf1 = buf;
                el = width * height;
                for( l = 0; l < el; l++ )
                        *wBuf1++ = *buf1++;
                l += sizeof( RD_HEADER );
        }

        *len = l;
        return wBuf;
}

這是日本源碼
看來已經外流了

//-------------------------------- TMN UPDATE 203.11.04 --
#include "stdafx.h"
//----------------------------------------------------↑↑
//
// データ圧縮全開
//

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#include"unpack.h"


#define BIT_CMP                        (unsigned char)0x80
#define BIT_ZERO                (unsigned char)0x40
#define BIT_REP_LARG        (unsigned char)0x10
#define BIT_REP_LARG2        (unsigned char)0x20
// 圧縮
// 引数
//                 buf    ... 圧縮するデータへのポインタ
//                disBuf ... 圧縮後のデータを入れるポインタ(NULLを入れるとメモリを自動的に確保)
//                width  ... 絵の幅
//                height ... 絵の縦
//                len    ... 圧縮後のサイズへのポインタ
//                cmpFlag ... 1 で圧縮、0で非圧縮
// 戻値
//                 圧縮データへのポインタ。失敗は0
unsigned char *encoder( unsigned char *buf, unsigned char **disBuf,
        unsigned int width, unsigned int height, unsigned int *len, int cmpFlag )
{
        unsigned char *wBuf, *ewBuf, *eBuf;
        unsigned char *wBuf1, *buf1;
        unsigned char *wBuf2, *buf2;
        unsigned char idx;
        int flag = 1;
        RD_HEADER *header;
        unsigned int cnt, cnt2;
        unsigned char repData;
        int mode;
        unsigned int l, el;
        int addWBuf;

~~~~~~~~~~~~~~~~~~~~~~~以下省略~~~~~~~~~~~~~~~~~~~~~
回复

使用道具 举报

1

主题

9

帖子

13

积分

新手上路

Rank: 1

积分
13
石币
4
发表于 2014-9-27 23:54:01 | 显示全部楼层
这些东西都是什么意思?
回复 支持 反对

使用道具 举报

0

主题

7

帖子

28

积分

新手上路

Rank: 1

积分
28
石币
21
发表于 2014-12-22 00:40:12 | 显示全部楼层
忘记什么时间给你发了一段,。。。
回复 支持 反对

使用道具 举报

0

主题

11

帖子

111

积分

注册会员

Rank: 2

积分
111
石币
0
发表于 2021-10-3 22:57:29 | 显示全部楼层
研究下,这个是好代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|石器时代LA官方

GMT+8, 2021-12-2 20:32 , Processed in 2.014585 second(s), 35 queries .

快速回复 返回顶部 返回列表