二進制編碼/解碼支持
Struct類提供了將Lua值與二進制Lua字符串中的C樣式結構相互轉換的基本功能。這是基于Roberto Ierusalimschy的Lua結構庫的,該庫位于http://www.inf.puc-rio.br/~roberto/struct/ 中 ,并作了一些小的修改,如下所示:
- 增加了支持
Int64/UInt64被包裝/解壓縮,使用“E” /“E”。 - 可以處理’long long’整數(i8 / I8);盡管它們已轉換為雙打。
- 可以在結構中的任何位置插入/指定填充。(“ X”,例如,字符串在并集后面)。
- 可以在
pack和中都報告當前偏移量unpack(“ = ”)。 - 當您只想使用“ ( ”和“ ) ”來計算大小或取消編組Pascal樣式的字符串時,可以屏蔽返回值。
除第一個更改外,所有更改均基于Flemming Madsen在lua用戶郵件列表中的電子郵件。
主要功能是Struct.pack,它將多個Lua值打包成類似struct的Lua二進制字符串;和Struct.unpack,從給定的類似結構的Lua二進制字符串中解壓縮多個Lua值。還有一些其他的輔助功能。
Struct庫中的所有函數都稱為靜態成員函數,而不是對象方法,因此它們被稱為“ Struct.pack(…)”而不是“ object:pack(…)”。
其中幾個Struct函數的第一個參數是格式字符串,它描述了結構的布局。格式字符串是一系列轉換元素,它們遵循當前字節序和當前對齊要求。最初,當前字節序為計算機的本機字節序,當前對齊要求為1(表示完全不對齊)。您可以使用格式字符串中的適當指令更改這些設置。
格式字符串中受支持的元素如下:
- `’(空白)被忽略。
- `!n ‘標志,用于將當前對齊要求設置為’n’(必須為2的冪);缺少的“ n”表示機器的本機對齊方式。
- “>”標志,將模式設置為大端(即網絡順序)。
- “ <”標志可將模式設置為小端。
- x填充零字節,沒有相應的Lua值。
- b是簽名的字符。
- “ B”是未簽名的字符。
- “ h”是帶符號的短號(本機大小)。
- ‘H’是無符號的short(本機大小)。
- “ l”是帶符號的長號(本機大小)。
- “ L”是無符號長整數(本機大小)。
- T是一個size_t(本機大小)。
- ‘i n ‘一個帶’n’個字節的有符號整數。缺少的“ n”表示整數的本機大小。
I *n* '類似于i n ‘,但未簽名。- e與一個Int64對象進行簽名的8字節整數(64位,很長)。
- 到/來自UInt64對象的`E’無符號8字節整數(64位,很長)。
- f是一個浮點數(本機大小)。
- d(雙精度)(本機大小)。
- s是一個以零結尾的字符串。
- c n對應于單個Lua字符串的正好為n個字符的序列。缺少的“ n”表示1。打包時,給定的字符串必須至少包含“ n”個字符(多余的字符將被丟棄)。
- c0類似于c n,不同的是n是以其他方式給出的:包裝時,n是給定字符串的長度。拆包時,“ n”是前一個拆包值的值(必須為數字)。在這種情況下,不會返回該先前值。
- x n ‘填充到’n’個字節數,默認為1。
- ‘X n ‘填充為’n’對齊,默認為MAXALIGN。
- (
停止分配項目)開始分配(打包時填充)。 - “ =”返回當前位置/偏移量。
Struct
Struct.pack(format, value)
返回包含根據格式字符串打包/編碼的值arg1,arg2等的字符串。
Arguments
format
The format string
value
One or more Lua value(s) to encode, based on the given format.
Returns
The packed binary Lua string, plus any positions due to ‘=’ being used in format.
Struct.unpack(format,struct,[begin])
從給定的類似結構的二進制Lua字符串中解壓縮/解碼多個Lua值。返回值的數量取決于給定的格式,加上返回停止讀取的位置的附加值。
Arguments
format
The format string
struct
The binary Lua string to unpack
begin (optional)
The position to begin reading from (default=1)
Returns
One or more values based on format, plus the position it stopped unpacking.
Struct.size(format)
返回給定格式字符串將使用/處理的二進制字符串的長度。
Arguments
format
The format string
Returns
The size number
Struct.values(format)
返回給定格式字符串中包含的Lua值的數量。這將是對Struct.unpack()的調用返回的值的數量,不包括偏移位置的額外返回值。(即Struct.values()不計算該額外的返回值)。這也將是Struct.pack()期望的參數數量,不包括格式字符串參數。
Arguments
format
The format string
Returns
The number of values
Struct.tohex(bytestring, [lowercase], [separator])
將傳入的二進制字符串轉換為十六進制字符串。
Arguments
bytestring
A Lua string consisting of binary bytes
lowercase (optional)
True to use lower-case hex characters (default=false).
separator (optional)
A string separator to insert between hex bytes (default=nil).
Returns
The Lua hex-ascii string
Struct.fromhex(hexbytes, [separator])
將傳入的十六進制ASCII字符串轉換為二進制字符串。
Arguments
hexbytes
A string consisting of hexadecimal bytes like “00 B1 A2” or “1a2b3c4d”
separator (optional)
A string separator between hex bytes/words (default none).
Returns
The Lua binary string。
Wireshark中文使用教程(開發版)
推薦文章: