`
modabobo
  • 浏览: 508745 次
文章分类
社区版块
存档分类
最新评论

Cocos2d-x学习(二十三):Base64解码

 
阅读更多

使用过Tiled的朋友应该都有所了解,Tiled生成的tmx格式的文件其实就是xml,唯一特殊的地方就是tmx文件中都会有一个或者多个"data"的节点,用来存放Tiled的块数据!类似于这样的格式

<map version="1.0" orientation="orthogonal" width="40" height="40" tilewidth="32" tileheight="32">
 <tileset firstgid="1" source="desert.tsx"/>
 <layer name="Ground" width="40" height="40">
  <data encoding="base64" compression="zlib">
   eJztmNkKwjAQRaN9cAPrAq5Yq3Xf6v9/nSM2VIbQJjEZR+nDwQZScrwztoORECLySBcIgZ7nc2y4KfyWDLx+Jb9nViNgDEwY+KioAXUgQN4+zpoCMwPmQAtoAx2CLFbA2oDEo9+hwG8DnIDtF/2K8ks086Tw2zH0uyMv7HcRr/6/EvvhnsPrsrxwX7rwU/0ODig/eV3mh3N1ld8eraWPaX6+64s9McesfrqcHfg1MpoifxcVEWjukyw+9AtFPl/I71pER3Of6j4bv7HI54s+MChhqLlPdZ/P3qMmFuo5h5NnTOhjM5tReN2yT51n5/v7J3F0vi46fk+ne7aX0i9l6If7mpufTX3f5wsqv9TAD2fJLT9VrTn7UeZnM5tR+v0LMQOHXwFnxe2/warGFRWf8QDjOLfP
  </data>
 </layer>
</map>

很明显,data数据已经被加密了,根据data的属性,可以得知是在压缩后进行了Base64编码!


1.什么是Base64:

我自己的总结就是 源字符串的二进制格式(之前一个字符由8位二进制位表示),拆分成6位二进制位,前面两位补0,组成新的8位二进制位的字符(这样可以保证新的字符只占8位中的低6位),也就是说用2^6=64个字符来表示原字符的一部分,暂时忘掉字符与ascii码之间的关系,Base64定义了一套字符表(即26个大写字母,26个小写字母,10个阿拉伯数字,已经‘+’'/'两个符号组成64个字符),详情请点击

2.解码:

(1)字符表

我使用了一个std::map<unsigned char, unsigned int>来保存Base64的字符表,键为64个Base64字符,值为相对索引

(26个大写字母,26个小写字母,10个阿拉伯数字,已经‘+’'/'两个符号的索引为从0到63)

(2)4的倍数

根据Base64的定义可以得知,Base64编码后的每4个字节对应原码的每3个字节,所以Base64编码后的字符的个数必须是4的倍数 (图片来源于wiki)



问题来了,如果原码是2个字符,应该对应的Base64编码是 2*4/3个,这样并不合理,需要我们在结尾处做特殊处理才能得到正确的结果,于是Base64定义为如果原码个数%3=1,则补2个'=';如果原码个数%3=2,则补1个‘=’。于是就有了Base64编码后面有0,1,2个=符号的可能,而在解码的时候会将'='解码为0.

(3)四变三

根据Base64的定义可知,每个字符的高2位都是0,只有填充的意义,而每个字符的低6位需要两两组合运算得到源码,将Base64编码后字符4个分成1组(可以解码出3个原码),我用A,B,C,D表示Base64编码后的字符,a,b,c表示1,2,3,4解码后的原码,根据规则可以得出:

a = (A << 2) + (B >> 4)

b = (B << 4) + (C >> 2)

c = (C << 6) + D

具体代码实现(Qt版本)

for (; i<(size-4); i+=4)
{
        unsigned char c1 = simplifiedText[i].toAscii();
        unsigned char c2 = simplifiedText[i+1].toAscii();
        unsigned char c3 = simplifiedText[i+2].toAscii();
        unsigned char c4 = simplifiedText[i+3].toAscii();

        if (!IsBase64Character(c1) || !IsBase64Character(c2) ||
                !IsBase64Character(c3) || !IsBase64Character(c4))
        {
            return Base64ParseError_Illegal_CH;
        }

        unsigned char ch1 = mAlphabetMap[c1];
        unsigned char ch2 = mAlphabetMap[c2];
        unsigned char ch3 = mAlphabetMap[c3];
        unsigned char ch4 = mAlphabetMap[c4];

        desText.append((unsigned char)((ch1 << 2) + (ch2 >> 4)));
        desText.append((unsigned char)((ch2 << 4) + (ch3 >> 2)));
        desText.append((unsigned char)((ch3 << 6) + ch4));
}
这里的范围只用到了size-4,是考虑到末尾4位的不确定性

unsigned char ch3 = 0;
    unsigned char ch4 = 0;

    if (c3 == '=' && c4 != '=')
    {
        return Base64ParseError_Illegal_CH;
    }
    else if (c3 != '=' && c4 != '=')
    {
        ch3 = mAlphabetMap[c3];
        ch4 = mAlphabetMap[c4];
    }
    else if (c3 != '=' && c4 == '=')
    {
        ch3 = mAlphabetMap[c3];
        ch4 = 0;
    }

3.测试解码

我选择了wiki上的一段文本,测试如图



(PS:还有一个检查字符是否为Base64的方法,只要在map中检测键值就可以了,这也是我选择map的原因。)

这个目前对于Tiled的研究还没有太大帮助,因为数据在进行Base64编码之前先进行了zip的压缩。


分享到:
评论

相关推荐

    Cocos2d-x实战:JS卷——Cocos2d-JS开发

    资源名称:Cocos2d-x实战:JS卷——Cocos2d-JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台...

    大富翁手机游戏开发实战基于Cocos2d-x3.2引擎

    资源名称:大富翁手机游戏开发实战基于Cocos2d-x3.2引擎内容简介:李德国编著的《大富翁手机游戏开发实战(基于 Cocos2d-x3.2引擎)》使用Cocos2d-x游戏引擎技术,带领读者一步一步从零开始进行大富翁移动游戏的开发...

    Cocos2d-x高级开发教程

    Cocos2d-x是移动跨平台开发最流行的游戏引擎,而本书是一本很全面的、比较‘接地气’的游戏开发教程。书中汇聚了热门手机游戏《捕鱼达人》开发的实战经验,作者从最基础的内容开始,逐步深入地介绍了Cocos2d-x的相关...

    Cocos2d-x实战 JS卷

    Cocos2d-x实战

    cocos2d-x 聊天小程序2: 两个客户端的数据交互

    cocos2d-x 聊天小程序2: 两个客户端的数据交互

    cocos2d-x-2.1.5

    cocos2d-x-2.1.5

    cocos2d-x-3.2旧版引擎下载

    cocos2d-x-3.2下载,不多说。或者可以下载另一个资源 cocos引擎老版本集合(cocos2d-x-2.2.1 - 3.5) http://download.csdn.net/download/crazymagicdc/9982656

    Cocos2d-x高级开发教程制作自己的《捕鱼达人》

    Cocos2d-x高级开发教程:制作自己的《捕鱼达人》 图书简介: 《Cocos2d-x高级开发教程:制作自己的《捕鱼达人》》是国内第一本全面深入讲解Cocos2d-x进阶内容的图书,Cocos2d-x创始人王哲作序推荐,《捕鱼达人》开发...

    cocos2d-x事件类

    在使用cocos2d-x开发游戏的过程中,为了实现逻辑和显示相分离。 在下通宵了一个晚上,写出了该事件类。 谨记,该事件只能用于cocos2d-x中。 事件发送者需要继承EventDispatcher类 事件接收者需要继承EventHandle类...

    Cocos2d-x学习笔记

    自己记录的Cocos2d-x学习笔记,希望能够帮助新手,快速入门,掌握cocos2d-x的开发

    cocos2d-x实战项目

    cocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML文件读取与骨骼动画.rarcocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML...

    Cocos2D-X游戏开发技术精解

    资源名称:Cocos2D-X游戏开发技术精解内容简介:Cocos2D-X是一款支持多平台的 2D手机游戏引擎,支持iOS、Android、BlackBerry等众多平台。当前,很多移动平台流行的游戏,都是基于Cocos2D-X开发的。 《Cocos2D-X...

    cocos2d-x-3.0 类图

    这是我重新弄的cocos2d-x-3.0的类图.之前别人兄台弄的,有些不全面,有些地方错误.我这个可以说是最新的了.每个类添加了中文的详细注解,同时也添加了中文的类名称翻译.这样对cocos2d-x-3.0的框架比较好上手. 有兴趣的...

    经典版本 方便下载 源码 旧版本 3.8 官网找不到了 cocos2d-x-3.8.zip

    经典版本 方便下载 源码 旧版本 3.8 官网找不到了 cocos2d-x-3.8.zip

    精通COCOS2D-X游戏开发 基础卷_2016.4-P399-13961841.pdf

    精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发

    Cocos2D-X游戏开发技术精解.pdf

    《Cocos2D-X游戏开发技术精解》详细介绍如何使用Cocos2D-X引擎开发自己的移动平台游戏。全书共15章,主要内容包括:Cocos2D-X引擎简介;如何建立跨平台的开发环境;引擎的核心模块——渲染框架;如何实现动态画面和...

    Cocos2d-x 3.x游戏开发实战pdf含目录

    Cocos2d-x 3.x游戏开发实战pdf含目录,内容详细,强烈推荐给大家。

    关东升-Cocos2d-x实战:Lua卷

    《Cocos2d-x实战 Lua卷》是介绍Cocos2d-x Lua游戏编程和开发技术的书籍,本书是第1版,带完整书签

    cocos2d-x windows vs2010配置

    Cocos2d-x windows vs2010 配置图文详解

    实例妙解Cocos2D-X游戏开发

    一线资深游戏开发工程师根据Cocos2D-X 最新版本撰写,Cocos2D-X创始人王哲、CSDN创始人蒋涛联袂推荐 完全通过真实游戏案例驱动,不仅将Cocos2D-X的各种功能、原理、技巧融入其中,而且还详细讲解了空战类、塔防类、...

Global site tag (gtag.js) - Google Analytics