hunter3216

nbt.lua

Apr 7th, 2021
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.66 KB | None | 0 0
  1. local math = math
  2. local bit32 = require "bit32"
  3. local computer = require "computer"
  4.  
  5. data = {}
  6. data.raw = {'\1','\0', '\1' ,'A','\162'}
  7. data.pointer = 1
  8. data.size = #data.raw
  9.  
  10. data.move = function(data,size)
  11.   size = size or 1
  12.   data.pointer = data.pointer + size
  13. end
  14.  
  15. data.read = function(data,size)
  16.   size = size or 1
  17.   local result = 0
  18.   for i=1, size do
  19.     result = result * 2^8 + data.raw[data.pointer]:byte()
  20.     data:move()
  21.   end
  22.   return result
  23. end
  24. data.get = function(data,n)
  25.   n = n or 1
  26.   return data.raw[data.pointer+n-1]:byte()
  27. end
  28.  
  29.  
  30. data.readByte = function(data)
  31.   local result = data:read()
  32.   return result
  33. end
  34.  
  35. data.readShort = function(data)
  36.   local result = data:read() * 2^8    -- FF 00
  37.   result = result + data:read() -- FF FF
  38.   if bit32.btest(result, 2^15) then
  39.     return (bit32.extract(bit32.bnot(result),0,16))-1
  40.   end
  41.   return result
  42.  
  43. end
  44.  
  45. data.readInt = function(data)
  46.   local result = data:read(4)
  47.   if bit32.btest(result, 2^31) then
  48.     return -bit32.bnot(result) - 1
  49.   end
  50.   return result
  51.  
  52. end
  53.  
  54. data.readLong = function(data)
  55.   local high = data:readInt()
  56.   local low = data:read(4)
  57.  
  58.   local neg = high < 0
  59.   if neg then
  60.     high = -(high + 1)
  61.     low = bit32.bnot(low)
  62.     return -(high * 2^32 + low) - 1
  63.   end
  64.   return high * 2^32 + low
  65. end
  66.  
  67. data.readFloat = function(data)
  68.   local sign = 1
  69.   local mantissa = data:get(2) % 128
  70.   for i = 3, 4 do
  71.     mantissa = mantissa * 256 + data:get(i)
  72.   end
  73.   if data:get(1) > 127 then sign = -1 end
  74.   local exponent = (data:get(1) % 128) * 2 + math.floor(data:get(2) / 128)
  75.   data:move(4)
  76.   if exponent == 0 then
  77.     return 0
  78.   end
  79.   mantissa = (math.ldexp(mantissa, -23) + 1) * sign
  80.   return math.ldexp(mantissa, exponent - 127)
  81. end
  82.  
  83. data.readDouble = function(data)
  84.   local sign = 1
  85.   local mantissa = data:get(2) % 2^4
  86.   for i = 3, 8 do
  87.     mantissa = mantissa * 256 + data:get(i)
  88.   end
  89.   if data:get(1) > 127 then sign = -1 end
  90.   local exponent = (data:get(1) % 128) * 2^4 + math.floor(data:get(2) / 2^4)
  91.   data:move(8)
  92.   if exponent == 0 then
  93.     return 0
  94.   end
  95.   mantissa = (math.ldexp(mantissa, -52) + 1) * sign
  96.   return math.ldexp(mantissa, exponent - 1023)
  97. end
  98.  
  99. data.readString = function(data)
  100.   local lenght = data:readShort()
  101.   local result = ""
  102.   for i = 1, lenght do
  103.     result = result .. string.char(data:readByte())
  104.   end
  105.   return result
  106. end
  107.  
  108. data.readByteArray = function(data)
  109.   local result = {}
  110.   for i = 1, data:readInt() do
  111.     result[i] = data:readByte()
  112.   end
  113.   return result
  114. end
  115.  
  116. data.readList = function(data)
  117.   local result = {}
  118.   local fun = data.readFun[data:readByte()]
  119.   for i = 1, data:readInt() do
  120.     result[i] = fun(data)
  121.   end
  122.   return result
  123. end
  124.  
  125. data.readIntArray = function(data)
  126.   local result = {}
  127.   for i = 1, data:readInt() do
  128.     result[i] = data:readInt()
  129.   end
  130.   return result
  131. end
  132.  
  133. data.readCompound = function(data)
  134.   local result = {}
  135.   while data.pointer <= data.size do
  136.     local id = data:readByte()
  137.     if id == 0 then return result end
  138.     result[data:readString()] = data.readFun[id](data)
  139.   end
  140.   return result
  141. end
  142.  
  143.  
  144. data.readFun = {
  145.     [1] = data.readByte,
  146.     [2] = data.readShort,
  147.     [3] = data.readInt,
  148.     [4] = data.readLong,
  149.     [5] = data.readFloat,
  150.     [6] = data.readDouble,
  151.     [7] = data.readByteArray, -- read byte array
  152.     [8] = data.readString,
  153.     [9] = data.readList, -- List
  154.     [10] = data.readCompound,
  155.     [11] = data.readIntArray -- Int List
  156.   }
  157.  
  158. return {
  159.     readFromNBT = function(rawdata)
  160.         data.raw = rawdata
  161.         data.pointer = 1
  162.         data.size = #data.raw
  163.         return data:readCompound()[""]
  164.     end
  165. }
  166.  
  167.  
Advertisement
Add Comment
Please, Sign In to add comment