好记性不如铅笔头

C && C++, 编程

lua简单笔记:读写二进制文件

最近需要使用LUA读写一些二进制文件,遇到了一些INT写入的问题,这里笔记下一些实现方式:
参考链接:
https://www.runoob.com/lua/lua-file-io.html
http://www.lua.org/manual/5.4/manual.html

使用函数取余的方式对INT进行转换:

-- B1 B2 B3 B4
local function B4(value)  return value % 256   end
local function B3(value)  return B4(value/256) end
local function B2(value)  return B3(value/256) end
local function B1(value)  return B2(value/256) end

local function write_int_to_raw_file()

    raw_file = io.open(raw_file_name, "wb")
	
    local raw_packet = {
		B4(int_val1), B3(int_val1), B2(int_val1), B1(int_val1),   
		B4(int_val2), B3(int_val2), B2(int_val2), B1(int_val2),
	}
	raw_file:write( string.char( table.unpack(raw_packet) ) )

	raw_file:flush()
end

使用位偏移的方式对INT进行转换:

local function write_int_to_raw_file()

    raw_file = io.open(raw_file_name, "wb")
	
    local raw_packet = {
        int_val1&0xFF, (int_val1>>8)&0xFF, (int_val1>>16)&0xFF, (int_val1>>24)&0xFF,
        int_val2&0xFF, (int_val2>>8)&0xFF, (int_val2>>16)&0xFF, (int_val2>>24)&0xFF,
	}
	raw_file:write( string.char( table.unpack(raw_packet) ) )

	raw_file:flush()
end

使用string.pack方式直接写入INT:

local function write_int_to_raw_file()

    raw_file = io.open(raw_file_name, "wb")
    raw_file:write( string.pack(">J>J>J>J", int_val1, int_val2) 

	raw_file:flush()
end

需要注意的是位运算和打包操作都需要Lua5.3及以上版本支持,这里还是比较麻烦的:

Leave a Reply

5 × 5 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据