我正在lua編寫一個Wireshark協議解析器。它解析的協議包含crc16校驗和。解剖員應該檢查crc是否正確。計算lua中bytearray/userdata的crc16
我發現用C編寫的crc16實現已經與lua包裝代碼here。我已成功編譯並運行它(例如crc16.compute("test")
)。問題是它期望一個字符串作爲輸入。從wireshark,我得到一個似乎是lua類型的緩衝區userdata
。所以當我做
crc16.compute(buffer(5, 19))
Lua抱怨bad argument #1 to compute (string expected, got userdata)
。
在crc16 implementationcompute()
看起來是這樣的:
static int compute(lua_State *L)
{
const char *data;
size_t len = 0;
unsigned short r, crc = 0;
data = luaL_checklstring(L, 1, &len);
for (; len > 0; len--)
{
r = (unsigned short)(crc >> 8);
crc <<= 8;
crc ^= crc_table[r^*data];
data ++;
}
lua_pushinteger(L, crc);
return 1;
}
看來luaL_checklstring
失敗。所以我想我可能需要將輸入轉換成一個lua字符串,我不確定它是否有效,因爲我輸入的所有字節都不一定是可打印的字符。或者我需要調整上面的代碼,以便它接受類型userdata的輸入。我發現lua_touserdata()
,但這似乎返回像一個指針。所以我需要第二個參數的長度,對吧?
我不一定需要使用此實現。任何接受用戶數據的lua的crc16實現都可以很好地解決問題。
也許wireshark提供了一種將緩衝區轉換爲Lua字符串的方法?也許'__tostring'?如果是這樣,你可以使用'lua_tostring'而不是'luaL_checklstring'。 – lhf
如果我做'uint8_t * data =(uint8_t *)lua_tostring(L,1); lua_pushinteger(L,data [0]);'然後wireshark崩潰。如果我做'uint8_t * data =(uint8_t *)lua_tolstring(L,1,&len); lua_pushinteger(L,len);'那麼我會得到'0'長度 –
另外,我的數據可能包含多個零字節,而lua字符串在第一個零終止,對嗎?不會在第一個零終止嗎? –