遇到一個需求是使用lua讀取一個二進制文件或者從網絡下載一個二進制文件,而後將文件數據傳入一個c函數中處理。先是想到使用userdata, 但lua讀取文件出來的是一個string,string貌似不能在lua代碼中轉換爲userdata,後來通過研究,發現直接用string就能夠做爲buffer, 由於Lua中string能夠包含二進制數據。c++
例如一個二進制文件,經過file:read("*a")讀取出所有內容做爲一個string返回,其實這個string就是一個二進制的string。可是若是用print打印,則會截斷在\0處。這樣讀取出來的二進制數據,能夠直接經過file:write再寫回文件中。所以在lua中能夠處理二進制文件的讀寫。網絡
一樣,string能夠做爲buffer和c/c++的交互,即從lua傳入c時,string能夠轉換爲const char*, 而從c返回一個buffer給lua時,也能夠push一個string進去。函數
可是有兩點要注意:測試
1)從lua傳入c時,顯然只傳入string並不夠,由於不能使用strlen計算buffer size, 所以須要附帶傳入buffer size, 這樣才能將const char*做爲一個buffer處理
lua
2)將buffer傳入到lua時,使用 lua_pushlstring(l, buf, bufSize); 不要使用lua_pushstring。由於lua_pushstring的實現中,會使用strlen計算字符串長度,對於buffer這顯然是錯誤的。spa
LUA_API void lua_pushstring (lua_State *L, const char *s) {
if (s == NULL)
lua_pushnil(L);
else
lua_pushlstring(L, s, strlen(s));
}orm
另外在lua代碼中,若是使用鏈接操做符..將一個包含二進制數據的string和一個普通string鏈接,則string可能被截斷爲一個普通string。這點我沒有找到明確的官方資料,也沒查看lua代碼證明,只是經過測試獲得的結論。字符串