用lua實現ByteArray和ByteArrayVarint
阿新 • • 發佈:2019-01-28
2014-01-10更新: ByteArray 和 ByteArrayVarint 已經進入 quick-cocos2d-x 的 framework.
許多 Actionscript 程式設計師已經從 Flash 轉到 Cocos2d-x 了。那麼以前的那些超級好用的類庫都不見了,只好重新來過。
我利用 Lua 和 lpack 庫實現了一套 lua版本的 ByteArray 。這套庫用於 quick-cocos2d-x(後稱quick) 中。因此依賴一些 quick 中已經包含的c庫和lua庫 。
主要依賴如下:
utils.ByteArray
ByteArray依賴 lpack 。
lpack 其實已經足夠好用了。但是由於lpack的指標功能有限,所以使用起來還是有些麻煩。這個類模仿了 Actionscript 的 flash.utils.ByteArray ,指標在內部實現,方便讀取和快取 socket 伺服器資料。
當然了,有一點點不同,但或許更好用。
下面是使用ByteArray的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
--直接使用lpack庫生成一個位元組流
local __pack=string.pack("<bihP2",0x59,11,1101,"","中文")
--建立一個ByteArray
local__ba=ByteArray.new()
--ByteArray允許直接寫入lpack生成的位元組流
__ba:writeBuf(__pack)
--不要忘了,lua |
下面就是效果了:
utils.ByteArrayVarint
ByteArrayVarint 繼承 ByteArray,同時依賴 BitOp。
Protocol Buffer協議是何方神聖,google一下就知道。簡單說就是能大幅降低 socket 協議中傳遞的位元組流的長度。但是protocol buffer協議還包含許多東西,而我只需要 varint 編碼而已。
我們的上一個遊戲就在 AS3中實現了varint編碼 。現在又用lua實現了一遍。
方法名稱 | 說明 |
---|---|
ByteArrayVarint.readUVInt() | read a unsigned varint int |
ByteArrayVarint.writeUVInt() | write a unsigned varint int |
ByteArrayVarint.readVInt() | read varint int |
ByteArrayVarint.writeVInt() | write varint int |
ByteArrayVarint.readStringUVInt() | read a string preceding a unsigned varint int |
ByteArrayVarint.writeStringUVInt() | write a string preceding a unsigned varint int |
雖然lua支援64位數字,但由於 BitOp 僅支援32位有符號整數,這個 ByteArrayVarint 類能做的事情有限,甚至比AS3的都要差點(AS3好歹還支援32位無符號整數)。但如果程式中不使用變態的64位(或更高)數字的話,還是挺好的。