Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- ###############################################
- # Nome: Lib byteReader #
- # Autor: Dalvo #
- # Descrição: E uma biblioteca que auxilia #
- # na leitura de arquivos binarios, pode-se #
- # dar varios usos a ela, e até aperfeiçoa-la. #
- ###############################################
- --]]
- byteReader = {}
- function byteReader:load(data)
- --[[
- * Inicia classe com atributo do tipo userdata 'data'
- * Seta atributos default e le data no modo "*a"
- --]]
- attr = {version = 0, numberOfSprites = 0, posByte = 1,file = data, data = data:read("*a"), id = 1}
- return setmetatable(attr, {__index = self})
- end
- function byteReader:getRanges(byte, signed)
- --[[
- * Pega os valores minimo e maximos para numero de bytes fornecidos
- * signed é uma variavel boolean, quando true rearranja os limites para tipo signed
- --]]
- local min, max = 0, ((256^byte) -1)
- if(signed)then
- min = -max/2
- max = max/2
- end
- return min, max
- end
- function byteReader:readBytes(byte, signed)
- --[[
- * le byte a byte somando seus valores 'byte' numero de vezes
- * se signed é true, reajusta o valor para signed
- --]]
- local min, _ = self:getRanges(byte, signed)
- local value = 0
- for var = 1, byte do
- value = value + ( self:nextByte() * (256^(var-1)) )
- end
- return value + min
- end
- function byteReader:nextByte()
- --[[
- * le 'posByte', que é um atributo de controle, serve apaenas para armazenar o proximo byte
- * reajusta 'posByte' para posição seguinte
- * retorna 'byte'
- --]]
- local byte = self.data:byte(self.posByte)
- self.posByte = self.posByte + 1
- return tonumber(byte)
- end
- --[[
- * faz a leitura byte a byte e retorna seu valor
- * valido para todos unsigneds abaixo
- --]]
- function byteReader:getUint64()
- return self:readBytes(8, false)
- end
- function byteReader:getUint32()
- return self:readBytes(4, false)
- end
- function byteReader:getUint16()
- return self:readBytes(2, false)
- end
- function byteReader:getUint8()
- return self:readBytes(1, false)
- end
- --[[
- * segue a mesma lógica anterior, com uma unica diferença
- * o valor final é reajustado para signed
- --]]
- function byteReader:getInt64()
- return self:readBytes(8, true)
- end
- function byteReader:getInt32()
- return self:readBytes(4, true)
- end
- function byteReader:getInt16()
- return self:readBytes(2, true)
- end
- function byteReader:getInt8()
- return self:readBytes(1, true)
- end
- function byteReader:closeData()
- --[[
- * fecha o atributo file
- --]]
- return self.file:close()
- end
- -- Exemplo de uso
- local file = io.open("Tibia.spr", "rb") -- abre o arquivo Tibia.spr no modo binario de leitura
- local spr = byteReader:load(file)
- io.write("Signatura: ".. spr:getUint16(), "\nNumero de Sprites: ", spr:getUint32())
- spr:closeData()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement