Cocos2d x學習(二十三) Base64解碼

2021-08-27 09:21:00 字數 2182 閱讀 1993

使用過tiled的朋友應該都有所了解,tiled生成的tmx格式的檔案其實就是xml,唯一特殊的地方就是tmx檔案中都會有乙個或者多個"data"的節點,用來存放tiled的塊資料!類似於這樣的格式

ejztmnkkwjaqran9capraq5yq3xf6v9/nsm2vibqjjezr+ndwqzscrwztooreclysbcigz7nc2y4kfywdlx+jb9nvingdewy+kioaxugqn4+zpocmwpmqatoax2clfba2odeo9+hwg8dnidtf/2k8ks086tw2zh0uymv7hcrr/6/evvhnsprsrxwx7rwu/0odig/ev3mh3n1ld8erawpax6+64s9mcesfrqchfg1mpoifxcvewjukyw+9atfpl/i71per3of6j4bv7hi54s+mchhqllpdz/p3qmmfuo5h5nntohjm5tren2yt51n5/v7j3f0vi46fk+ne7ax0i9l6if7mpuftx3f5wsqv9tad2fjlt9vrtn7ueznm5tr+v0lmqohxwfnxe2/wargfrwf8qdjolfp

很明顯,data資料已經被加密了,根據data的屬性,可以得知是在壓縮後進行了base64編碼!

我自己的總結就是 源字串的二進位制格式(之前乙個字元由8位二進位制位表示),拆分成6位二進位制位,前面兩位補0,組成新的8位二進位制位的字元(這樣可以保證新的字元只佔8位中的低6位),也就是說用2^6=64個字元來表示原字元的一部分,暫時忘掉字元與ascii碼之間的關係,base64定義了一套字元表(即26個大寫字母,26個小寫字母,10個阿拉伯數字,已經『+』'/'兩個符號組成64個字元),詳情

我使用了乙個std::map來儲存base64的字元表,鍵為64個base64字元,值為相對索引

(26個大寫字母,26個小寫字母,10個阿拉伯數字,已經『+』'/'兩個符號的索引為從0到63)

根據base64的定義可以得知,base64編碼後的每4個位元組對應原碼的每3個位元組,所以base64編碼後的字元的個數必須是4的倍數 (**於wiki)

問題來了,如果原碼是2個字元,應該對應的base64編碼是 2*4/3個,這樣並不合理,需要我們在結尾處做特殊處理才能得到正確的結果,於是base64定義為如果原碼個數%3=1,則補2個'=';如果原碼個數%3=2,則補1個『=』。於是就有了base64編碼後面有0,1,2個=符號的可能,而在解碼的時候會將'='解碼為0.

根據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

unsigned char ch1 = malphabetmap[c1];

unsigned char ch2 = malphabetmap[c2];

unsigned char ch3 = malphabetmap[c3];

unsigned char ch4 = malphabetmap[c4];

}

這裡的範圍只用到了size-4,是考慮到末尾4位的不確定性

unsigned char ch3 = 0;

unsigned char ch4 = 0;

if (c3 == '=' && c4 != '=')

else if (c3 != '=' && c4 != '=')

else if (c3 != '=' && c4 == '=')

我選擇了wiki上的一段文字,測試如圖

(ps:還有乙個檢查字元是否為base64的方法,只要在map中檢測鍵值就可以了,這也是我選擇map的原因。)

這個目前對於tiled的研究還沒有太大幫助,因為資料在進行base64編碼之前先進行了zip的壓縮。

Cocos2d x學習(二十三) Base64解碼

使用過tiled的朋友應該都有所了解,tiled生成的tmx格式的檔案其實就是xml,唯一特殊的地方就是tmx檔案中都會有乙個或者多個 data 的節點,用來存放tiled的塊資料!類似於這樣的格式 ejztmnkkwjaqran9capraq5yq3xf6v9 nsm2vibqjjezr ndwq...

Cocos2d x學習筆記1

1.建立新的cocos2d x 3.0 專案 在命令列中輸入 cocos new helloworld 專案名稱 p com.ss.pku 包名字 l cpp 專案型別 d d cocos workspace 專案存放路徑 2.資料夾分析 resource 資料夾 存放資源檔案 include和so...

Cocos2d x學習筆記(7)

1 動作基本概念 ccactiong是動作類的基類,動作作用於ccnode,因此,任何乙個動作都需要ccnode物件來執行。ccaction作為乙個基類,其實質是乙個介面 抽象類 由它派生的實現類才是實際使用的動作。ccaction的絕大多數實現類都派生自ccfinitetimeaction,這個類...