Advertisement
Guest User

ptrsave

a guest
Apr 6th, 2020
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 1.41 KB | None | 0 0
  1. local function BSiter(a,i) i=i+1; if a[i] then return i,a[i] end end
  2. local function BSipairs(t)
  3.     return BSiter,t,-1
  4. end
  5.  
  6. for i,v in BSipairs{[0]=0,1,2,3} do print(i,v) end
  7.  
  8. local dat_lut = {
  9.     len = 4;
  10.     mem = { };
  11. }
  12.  
  13. for i = 0,3 do
  14.     local nmat = { len = math.random(1,16),m={} }
  15.     for i = 0,nmat.len-1 do nmat.m[i] = math.random(0,255) end
  16.     dat_lut.mem[i] = nmat
  17. end
  18.  
  19.  
  20. local function arradd(t,v) t[#t+1] = v end
  21. local function u8str(n) return string.char(n&0xFF) end
  22. local function u16str(n) return u8str(n)..u8str(n>>8) end
  23. local function u32str(n) return u16str(n)..u16str(n>>16) end
  24.  
  25. local function dat_save(dat)
  26.     local ptrtab = {}
  27.     local dattab = {ptrtab}
  28.     -- save pointers
  29.     local datlen = dat.len
  30.     arradd(ptrtab,u16str(datlen))
  31.     --> get size of pointer lut
  32.     local ptrend = 2
  33.     for i,d in pairs(dat.mem) do
  34.         ptrend = ptrend + 4
  35.     end
  36.     --> size of each dat struct is 2+len
  37.     local ptroff = 0
  38.     for i,d in BSipairs(dat.mem) do
  39.         print(("dat[i].len: %04X"):format(d.len))
  40.         arradd(ptrtab,u32str(ptrend + ptroff))
  41.         ptroff = ptroff + (2+d.len)
  42.     end
  43.     -- save data
  44.     for i = 0,dat.len-1 do
  45.         local d = dat.mem[i]
  46.         arradd(dattab,u16str(d.len))
  47.         for b=0,d.len-1 do arradd(dattab,u8str(d.m[b])) end
  48.     end
  49.     -- serialize
  50.     dattab[1] = table.concat(ptrtab)
  51.     local datstr = table.concat(dattab)
  52.     return datstr
  53. end
  54.  
  55. local str = dat_save(dat_lut)
  56. local f = io.open("dat.bin",'wb')
  57. f:write(str); f:close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement