1. 程式人生 > >用lua實現ByteArray和ByteArrayVarint

用lua實現ByteArray和ByteArrayVarint

2014-01-10更新: ByteArray 和 ByteArrayVarint 已經進入 quick-cocos2d-x 的 framework.

許多 Actionscript 程式設計師已經從 Flash 轉到 Cocos2d-x 了。那麼以前的那些超級好用的類庫都不見了,只好重新來過。

我利用 Lua 和 lpack 庫實現了一套 lua版本的 ByteArray 。這套庫用於 quick-cocos2d-x(後稱quick) 中。因此依賴一些 quick 中已經包含的c庫和lua庫 。

主要依賴如下:

  • lpack (已經包含在quick中)
  • BitOp (已經包含在quick中)

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
陣列是1基的。而且函式名稱比position__ba:setPos(1) --這個用法和AS3相同了,只是有些函式名稱被我改掉了 print("ba.len:",__ba:getLen()) print("ba.readByte:",__ba:readByte()) print("ba.readInt:",__ba:readInt()) print("ba.readShort:",__ba:readShort()) print("ba.readString:",__ba:readStringUShort()) print("ba.available:",__ba:getAvailable()) --自帶的toString方法可以以10進位制、16進位制、8進位制列印 print("ba.toString(16):",__ba:toString(16)) --建立一個新的ByteArray local __ba2=ByteArray.new() --AS3的用法相同,還支援鏈式呼叫 __ba2:writeByte(0x59) :writeInt(11) :writeShort(1101) --寫入空字串 __ba2:writeStringUShort("") --寫入中文(UTF8)字串 __ba2:writeStringUShort("中文") --十進位制輸出 print("ba2.toString(10):",__ba2:toString(10))

下面就是效果了:

luabytearray

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位(或更高)數字的話,還是挺好的。

我會把常用的 lua 功能寫出來整合在這個庫裡並開源,就像我的 as3庫 java庫 一樣。