Advertisement
dalvorsn

Untitled

May 12th, 2012
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.79 KB | None | 0 0
  1. --[[
  2. ###############################################
  3. # Nome: Lib byteReader                        #
  4. # Autor: Dalvo                                #
  5. # Descrição: E uma biblioteca que auxilia     #
  6. # na leitura de arquivos binarios, pode-se    #
  7. # dar varios usos a ela, e até aperfeiçoa-la. #
  8. ###############################################
  9. --]]
  10.  
  11. byteReader = {}
  12.  
  13. function byteReader:load(data)
  14. --[[
  15.     * Inicia classe com atributo do tipo userdata 'data'
  16.     * Seta atributos default e le data no modo "*a"
  17. --]]
  18.     attr = {version = 0, numberOfSprites = 0, posByte = 1,file = data, data = data:read("*a"), id = 1}
  19.     return setmetatable(attr, {__index = self})
  20. end
  21.  
  22.  
  23. function byteReader:getRanges(byte, signed)
  24. --[[
  25.     * Pega os valores minimo e maximos para numero de bytes fornecidos
  26.     * signed é uma variavel boolean, quando true rearranja os limites para tipo signed
  27. --]]
  28.     local min, max = 0, ((256^byte) -1)
  29.     if(signed)then
  30.         min = -max/2
  31.         max = max/2
  32.     end
  33.     return min, max
  34. end
  35.  
  36. function byteReader:readBytes(byte, signed)
  37. --[[
  38.     * le byte a byte somando seus valores 'byte' numero de vezes
  39.     * se signed é true, reajusta o valor para signed
  40. --]]
  41.     local min, _ = self:getRanges(byte, signed)
  42.     local value = 0
  43.     for var = 1, byte do
  44.         value = value +  ( self:nextByte() * (256^(var-1)) )
  45.     end
  46.     return value + min
  47. end
  48.  
  49. function byteReader:nextByte()
  50. --[[
  51.     * le 'posByte', que é um atributo de controle, serve apaenas para armazenar o proximo byte
  52.     * reajusta 'posByte' para posição seguinte
  53.     * retorna 'byte'
  54. --]]
  55.     local byte = self.data:byte(self.posByte)
  56.     self.posByte = self.posByte + 1
  57.     return tonumber(byte)
  58. end
  59.  
  60. --[[
  61.     * faz a leitura byte a byte e retorna seu valor
  62.     * valido para todos unsigneds abaixo
  63. --]]
  64. function byteReader:getUint64()
  65.     return self:readBytes(8, false)
  66. end
  67.  
  68. function byteReader:getUint32()
  69.     return self:readBytes(4, false)
  70. end
  71.  
  72. function byteReader:getUint16()
  73.     return self:readBytes(2, false)
  74. end
  75.  
  76. function byteReader:getUint8()
  77.     return self:readBytes(1, false)
  78. end
  79.  
  80. --[[
  81.     * segue a mesma lógica anterior, com uma unica diferença
  82.     * o valor final é reajustado para signed
  83. --]]
  84. function byteReader:getInt64()
  85.     return self:readBytes(8, true)
  86. end
  87.  
  88. function byteReader:getInt32()
  89.     return self:readBytes(4, true)
  90. end
  91.  
  92. function byteReader:getInt16()
  93.     return self:readBytes(2, true)
  94. end
  95.  
  96. function byteReader:getInt8()
  97.     return self:readBytes(1, true)
  98. end
  99.  
  100.  
  101. function byteReader:closeData()
  102. --[[
  103.     * fecha o atributo file
  104. --]]
  105.     return self.file:close()
  106. end
  107.  
  108. -- Exemplo de uso
  109.  
  110. local file = io.open("Tibia.spr", "rb") -- abre o arquivo Tibia.spr no modo binario de leitura
  111. local spr = byteReader:load(file)
  112. io.write("Signatura: ".. spr:getUint16(), "\nNumero de Sprites: ", spr:getUint32())
  113. spr:closeData()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement