lua5.3引入了乙個在二進位制和基本型別值(數值和字串)之間進行轉換的函式。
函式string.pack會把值「打包(pack)」為二進位制字串。
函式string.unpack則會從二進位制字串中提取這些值。
函式string.pack,string.unpack的第乙個引數都是格式化字串,用於描述如何打包資料,格式化字串中每個字母都描述了如何打包/解包乙個值
如:
s = string.pack("iii", 3, -27, 450)
#s -->12
string.unpack("iii", s) --> 3, -27, 450, 13
呼叫函式string.pack將建立乙個字串,其中為3個整形數的二進位制**(根據"iii"),每乙個"i"編碼對與之對應的引數進行編碼,而字串的長度則是乙個整形數本身大小的3倍(即3*4byte).
呼叫函式string.unpack對給定字串中的3個整形數進行了解碼(根據「iii」)並返回解碼後的結果,同時為了便於迭代,函式string.unpack韓會返回最後乙個讀取的元素在字串中的位置,相應的,該函式還有乙個可選的第三個引數,改引數用於指定開始讀取的位置。
s = "hellp\0lua\0world\0"
local i = 1
while i <= #s do
local res
res, i = string.unpack("z", s, i)
print(res)
end-->hellp
-->lua
-->world
選項「z」意味著乙個以'\0'結尾的字串。呼叫函式unpack會從函式提取位於i的字串,並返回該字串外加迴圈迭代的下乙個位置。
編碼乙個整形數有如下幾種選項:b(char), h(short), i(int), l(long), 和j(lua語言中整形數的大小)。
我們還可以使用三種形式打包字串:\0結尾的字串,定長字串和使用顯示長度的字串。
對於浮點型數,有三種選項:f用於單精度浮點數,d用於雙精度浮點數,n用於lua語言浮點數。
格式字串也有用於控制大小端模式和二進位制資料對齊的選項。
選項》將所有後續編碼轉換為大端模式,選項《將所有後續編碼改為小端模式,而選項=將用機器預設的原生大小端模式。
函式string.pack通過在結果字串到達合適索引值前增加0的方式實現對齊,函式string.unpack在讀取字串是會簡單的跳過這些補位。
函式io.open和io.output總是用文字方式開啟檔案,io.open提供可以在模式字串中使用字母b來讀取二進位制檔案。
Lua程式設計(三)
通過昨天用lua程式語言解決八皇后問題,我對於lua語言的程式編寫有了大致的了解。今天開始了解lua的數值相關概念。在lua5.3中為數值格式提供了兩種選擇 一種為64位的integer型別,另一種則是雙精度的float型別。如果是資源受限的平台,如微控制器等我們可以使用精簡的32位數值格式。lua...
Lua程式設計(四)
字串是用於表示文字的手段。lua語言提供的字串是由一串位元組組成的序列。每個字元用8個位元位來儲存。雖然lua支援用任意一種方法來儲存unicode字串,但是最好在一切可能的情況下優先使用utf 8編碼。需要注意的是lua中的字串是不可變值,不能直接修改字串中的某個字元,僅能通過建立乙個新的字串來達...
Lua程式設計(七)
函式是對語句和表示式進行抽象的主要方式,呼叫函式時應使用一堆圓括號把引數列表括起來,即使不需要引數,也需要一對空括號 lua語言也為物件導向風格的呼叫 object oriented call 提供了冒號操作符。形如 o foo x 意為呼叫物件o的foo方法。乙個函式定義具有乙個函式名 name ...