天天看点

游戏工作不等于要加班!——base64位加解密原理

<span style="font-family: Arial, Helvetica, sans-serif;"></span>
           

1、首先,身为一名游戏编码人员,内心要记住一点:游戏不等于要加班,加班文化是你任职的公司加于你身上。加班制度是资方压榨员工劳动力却不愿付出合理薪酬的有力工具,同时他们让行政和人事培养一种加班的员工是好员工的考核标准,去潜移默化你的行为。首先,加班最初是源于实际工作量和实际生产效率的不对等。也就是说要么是员工没实力去完成一项工作,而他为了不影响与他们协作的制度而选择继续工作,OT是他追赶上游想成为具有专业技术实力的方式。要么是资方企图提升员工生产力和时间赛跑的有力工具,当然如果加班费不比正常工作薪酬时薪低的话这是一种良心政策,可是远低于正常时薪的话,辞职吧!对,我说的。

只有没能力没道德的人才担心找不到工作,既然都是加班谁给的钱多帮谁加班。不能说没用才需要加班,但是我喜欢用这么说,因为我讨厌这种加班文化,加班可积分换女友吗?

2、我们身为开发人员,不过是美术还是策划、程序,都应该为自身的环境创造一份良好的氛围。OT则是留给庸碌的从业人员追赶我们的手段。并不是固步自封,而是私人时间的合理分配让我们成为更出色的从业人员:我们需要了解行业资讯、行业方向、新技术,如果一味地加班,没有整理思维沉淀,很快就真的成为庸碌者,只能在沉默中被压榨。如我的前任客户端老大说的,自己的利益要自己去争取,不说出来每人会为我们考虑。

3、如果有一定的软件工程思想就知道,一项工作交给少数高效的人去完成和一堆庸碌的人去鼓捣,总成本和效益是差不多的。当然不同的在于高效的那几个人不愿意接受一些不高效的管理人员干预,而庸碌者则深深体会到上头与之共同进退(都是那么庸碌,哪能相互嫌弃)。

4、讲到最后还是一个钱字。分钱分货,亘古不变。无论是钟迪龙还是我,都不喜欢为一些为自己利益损害他人合理利益的人。出来混总是要还,这么喜欢加班,假如有一天一些新入游戏行业的公司采取不加班政策挖人,看这些有加班文化的公司股价怎么跌!当然有些比我们出色的人深谙此道,但他们从来不谈论这个话题,因为大家都知道28原则,总有8个人要为2个人加班卖命。不好意思要我卖命要卖的合理(合理的规则是加班不比正常时薪低)。故此:让单双周去死吧,让9点后下班的铃声去投胎去。

5、今天重新去碰一年前的代码,因为简历上我很诚实也很傻地说这个项目最后没上线。其实我早离职了,离职之前上面都没有对它产生过上线的想法。原先的内存指针错误,Socket登陆成功之后切换scene出现内存泄露,还有一些组件的使用不当。另外可能还有一些其他相关的缺漏,可惜我发现现在我配不来当初的开发环境。一个项目死了,它的开发环境和细节一定留一份详细的文档记录,否则人员流动,这个项目的技术问题就算解决了也无法去修改。</p><p></p><p>下面是脚本对称式加解密的代码。可以直接搜索Base64,实际使用要做的变动就是把dataChars数组元素的位置随机变化生成钥匙,同时更新一下语法,比如static和数组的方式很少用了,可以考虑使用map来存储

<span style="font-family: Arial, Helvetica, sans-serif;">/</span><span style="font-family: Arial, Helvetica, sans-serif;">/  DataEncipher.cpp</span>
           
//
//  DataHimi.cpp
//  Oh!MonsterMR
//
//  Created by Himi on 12-3-8.
//  Copyright (c) 2012年 Augustimpression. All rights reserved.
//

//  Copyright (c) 2014年 Jingz. All rights reserved. I writed the annotation.

#include "DataEncipher.h"

/*
//3*8 = 4*6 2^6 = 64.
//对称式加解密,用于安全级别要求不是很高的地方,=号用于填充, 即为dataChars钥匙,需要自己根据情况做变动,
//如果用于脚本源码加密,如果对方知道脚本语法特点,挑一些字段单词解析,根据结果和分析,还是有泄漏的风险。
//(因为一个大型游戏的脚本式足够吸引一些人花半个月去解析),所以要求脚本代码的启动入口前增加混淆视听的注释,而且是类代码结构的注释型脚本,
//同时要求注释段的开始和结束不能为对称式,要不然相当于泄漏了注释符的加密和解密方式。现实是,全TM中小公司,担心个屁。
*/

static const std::string dataChars = 
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";

static inline bool baseData(unsigned char c) {
    return (isalnum(c) || (c == '+') || (c == '/'));
}

std::string EncipherSaveData(unsigned char const* bytes_to_encode, unsigned int in_len) {
    std::string ret;
    int i = 0;
    int j = 0;
    unsigned char char_array_3[3];
    unsigned char char_array_4[4];
    
    while (in_len--) {
        char_array_3[i++] = *(bytes_to_encode++);
		//每三个字符转换为4*6bit 预设字符
        if (i == 3) {
            char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; //前1-6位与1111 1100,然后右移2位,几位前6bit在新编码中的表示方式
            char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);//7-12
            char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);//13-19
            char_array_4[3] = char_array_3[2] & 0x3f;//19-24
            
            for(i = 0; (i <4) ; i++)
                ret += dataChars[char_array_4[i]];
            i = 0;
        }
    }
    
	//格式补齐填充,用0结束符填充,解析时遇到0则结束。
    if (i)
    {
        for(j = i; j < 3; j++)
            char_array_3[j] = '\0';
        
        char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
        char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
        char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
        char_array_4[3] = char_array_3[2] & 0x3f;
        
        for (j = 0; (j < i + 1); j++)
            ret += dataChars[char_array_4[j]];
        
		//标记填充字节数于数据段末尾。
        while((i++ < 3))
            ret += '=';
        
    }
    
    return ret;
    
}

std::string EncipherParseData(std::string const& encoded_string) {
    int in_len = encoded_string.size();
    int i = 0;
    int j = 0;
    int in_ = 0;
    unsigned char char_array_4[4], char_array_3[3];
    std::string ret;
    
    while (in_len-- && ( encoded_string[in_] != '=') && baseData(encoded_string[in_])) {
        char_array_4[i++] = encoded_string[in_]; in_++;
        if (i ==4) {
            for (i = 0; i <4; i++)
                char_array_4[i] = dataChars.find(char_array_4[i]);
            
            char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
            char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
            char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
            
            for (i = 0; (i < 3); i++)
                ret += char_array_3[i];
            i = 0;
        }
    }
    
    if (i) {
        for (j = i; j <4; j++)
            char_array_4[j] = 0;
        
        for (j = 0; j <4; j++)
            char_array_4[j] = dataChars.find(char_array_4[j]);
        
        char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
        char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
        char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
        
        for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
    }

    return ret;
}
           

继续阅读