Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local function BSiter(a,i) i=i+1; if a[i] then return i,a[i] end end
- local function BSipairs(t)
- return BSiter,t,-1
- end
- for i,v in BSipairs{[0]=0,1,2,3} do print(i,v) end
- local dat_lut = {
- len = 4;
- mem = { };
- }
- for i = 0,3 do
- local nmat = { len = math.random(1,16),m={} }
- for i = 0,nmat.len-1 do nmat.m[i] = math.random(0,255) end
- dat_lut.mem[i] = nmat
- end
- local function arradd(t,v) t[#t+1] = v end
- local function u8str(n) return string.char(n&0xFF) end
- local function u16str(n) return u8str(n)..u8str(n>>8) end
- local function u32str(n) return u16str(n)..u16str(n>>16) end
- local function dat_save(dat)
- local ptrtab = {}
- local dattab = {ptrtab}
- -- save pointers
- local datlen = dat.len
- arradd(ptrtab,u16str(datlen))
- --> get size of pointer lut
- local ptrend = 2
- for i,d in pairs(dat.mem) do
- ptrend = ptrend + 4
- end
- --> size of each dat struct is 2+len
- local ptroff = 0
- for i,d in BSipairs(dat.mem) do
- print(("dat[i].len: %04X"):format(d.len))
- arradd(ptrtab,u32str(ptrend + ptroff))
- ptroff = ptroff + (2+d.len)
- end
- -- save data
- for i = 0,dat.len-1 do
- local d = dat.mem[i]
- arradd(dattab,u16str(d.len))
- for b=0,d.len-1 do arradd(dattab,u8str(d.m[b])) end
- end
- -- serialize
- dattab[1] = table.concat(ptrtab)
- local datstr = table.concat(dattab)
- return datstr
- end
- local str = dat_save(dat_lut)
- local f = io.open("dat.bin",'wb')
- f:write(str); f:close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement