Ir para conteúdo
Entre para seguir isso  
Conde2

ByteArray Class

Recommended Posts

Conde2    0
Conde2

Byte Array

version 1.0 (BETA)

Credits: Conde2

 

Galera eu procurei na internet uma lib assim e não achei, bom então resolvi fazer =D

Essa lib serve para tratar de bytes, ela possui quase todas funções que se precisa para tratar cadeias de bytes.

Bom chega de delongas aqui esta o script:

 

--|                Byte Array                           |--
--|             version 1.0 (BETA)                   |--
--|  Credits: Joao Pasqualini Costa (Conde2)  |--

ByteArray = {}


function ByteArray:new(pdata, psize)
        local obj = {
              readPos = 1,
              data = pdata,
              size = psize               
        }

        if not obj.data then obj.data = {} end
        if not obj.size then obj.size = 0 end

        return setmetatable(obj, {__index = self})
end


function ByteArray:reset()
        self.data = {}
        self.size = 0
        self.readPos = 1   
end


function ByteArray:stringToByteArray(str)
   local newsize = #str
   for i = 1, newsize do
        self.data[i] = str:byte(i)
   end

   self.size = newsize
   return self.data
end

function ByteArray:readBytes(byte, pos) -- Made by Dalvo edited by Conde2
   local value = 0
   local pos = pos or self.readPos
   self.readPos = pos

   if (self.readPos - 1) + byte > self.size then
           print("[byteArray:readBytes()]: Message has reached end.")
           return false
       end

   for var = 0, byte-1 do
       value = value + ( (self.data[self.readPos + var]) * (256 ^ var) )
   end
   self.readPos = self.readPos + byte


          return value
end


function ByteArray:getU32(startpos)
   return self:readBytes(4, startpos)
end


function ByteArray:getU16(pos)
   return self:readBytes(2, startpos)
end


function ByteArray:getByte(pos)
   return self:readBytes(1, startpos)
end


function ByteArray:getString(startpos)

       local size = self:getU16(startpos)


       if not size then 
           return false
       end



       if (self.readPos - 1) + size > self.size then
           print("[byteArray:getString()]: Message has reached end.")
           return false
       end

       local ret = ""
       for i = 0, size-1 do
           ret = ret .. string.char(self.data[self.readPos + i]) 
       end

       self.readPos = self.readPos + size
       return ret
   end


function ByteArray:prepareBytes(byte, value)


        if value >= 256^byte then
           print("[byteArray:prepareBytes()]: Value is greater than: " .. (256^byte) .. ".")
           return false
       end

   for var = 1, byte do


           self.data[self.size + ((byte+1)-var)] = math.floor(value / (256 ^ (byte-var)))
           value = value - math.floor(value / (256 ^ (byte-var)))*(256 ^ (byte-var))
   end
        self.size = self.size + byte
        return value
end


function ByteArray:addU32(value)
   return self:prepareBytes(4, value)
end


function ByteArray:addU16(value)
   return self:prepareBytes(2, value)
end


function ByteArray:addByte(value)
   return self:prepareBytes(1, value)
end


function ByteArray:addString(value)
      if not self:addU16(string.len(value)) then
           print("[byteArray:addString()]: String length is bigger than " .. (256^2) .. ".")
           return false
       end

       for i = 1, string.len(value) do
           self:addByte(value:byte(i))
       end
       return true
end


function ByteArray:insertBytes(bytes, pos, size)


      local pos = pos or #data + 1
      local data = (type(bytes) == "table") and bytes or {bytes}
      local size = size or #data

      self.size = self.size + size

      for i = 0, #data-1 do
          table.insert(self.data, pos, data[#bytes-i])
      end

      return true
end


function ByteArray:removeBytes(byte, pos)
      local byte = byte or 1
      local pos = pos or (self.size - byte) + 1


      for _ = 1, byte do 
          table.remove(self.data, pos)
      end

      self.readPos = self.readPos - byte
      self.size = self.size - byte

      return true
end




function ByteArray:removeU32(pos)
   return self:removeBytes(4, pos)
end


function ByteArray:removeU16(pos)
   return self:removeBytes(2, pos)
end


function ByteArray:removeByte(pos)
   return self:removeBytes(1, pos)
end

 

Alguns exemplos de uso:

 

packet = ByteArray:new()
packet:addU16(500)
packet:getU16(500)
packet:removeU16()
packet:addByte(5)


final_packet = ByteArray:new()
final_packet:addString("oi")
final_packet:insertBytes(packet.data, final_packet.size + 1)


print(final_packet:getString())
print(final_packet:getByte())

 

Old version: http://pastebin.com/BJEHG3Ky

Editado por Conde2

Compartilhar este post


Link para o post
Conde2    0
Conde2

Byte Array

version 1.0 (BETA)

Credits: Conde2

 

Galera eu procurei na internet uma lib assim e não achei, bom então resolvi fazer =D

Essa lib serve para tratar de bytes, ela possui quase todas funções que se precisa para tratar cadeias de bytes.

Bom chega de delongas aqui esta o script:

 

--|                Byte Array                           |--
--|             version 1.0 (BETA)                   |--
--|  Credits: Joao Pasqualini Costa (Conde2)  |--

ByteArray = {}


function ByteArray:new(pdata, psize)
        local obj = {
              readPos = 1,
              data = pdata,
              size = psize               
        }

        if not obj.data then obj.data = {} end
        if not obj.size then obj.size = 0 end

        return setmetatable(obj, {__index = self})
end


function ByteArray:reset()
        self.data = {}
        self.size = 0
        self.readPos = 1   
end


function ByteArray:stringToByteArray(str)
   local newsize = #str
   for i = 1, newsize do
        self.data[i] = str:byte(i)
   end

   self.size = newsize
   return self.data
end

function ByteArray:readBytes(byte, pos) -- Made by Dalvo edited by Conde2
   local value = 0
   local pos = pos or self.readPos
   self.readPos = pos

   if (self.readPos - 1) + byte > self.size then
           print("[byteArray:readBytes()]: Message has reached end.")
           return false
       end

   for var = 0, byte-1 do
       value = value + ( (self.data[self.readPos + var]) * (256 ^ var) )
   end
   self.readPos = self.readPos + byte


          return value
end


function ByteArray:getU32(startpos)
   return self:readBytes(4, startpos)
end


function ByteArray:getU16(pos)
   return self:readBytes(2, startpos)
end


function ByteArray:getByte(pos)
   return self:readBytes(1, startpos)
end


function ByteArray:getString(startpos)

       local size = self:getU16(startpos)


       if not size then 
           return false
       end



       if (self.readPos - 1) + size > self.size then
           print("[byteArray:getString()]: Message has reached end.")
           return false
       end

       local ret = ""
       for i = 0, size-1 do
           ret = ret .. string.char(self.data[self.readPos + i]) 
       end

       self.readPos = self.readPos + size
       return ret
   end


function ByteArray:prepareBytes(byte, value)


        if value >= 256^byte then
           print("[byteArray:prepareBytes()]: Value is greater than: " .. (256^byte) .. ".")
           return false
       end

   for var = 1, byte do


           self.data[self.size + ((byte+1)-var)] = math.floor(value / (256 ^ (byte-var)))
           value = value - math.floor(value / (256 ^ (byte-var)))*(256 ^ (byte-var))
   end
        self.size = self.size + byte
        return value
end


function ByteArray:addU32(value)
   return self:prepareBytes(4, value)
end


function ByteArray:addU16(value)
   return self:prepareBytes(2, value)
end


function ByteArray:addByte(value)
   return self:prepareBytes(1, value)
end


function ByteArray:addString(value)
      if not self:addU16(string.len(value)) then
           print("[byteArray:addString()]: String length is bigger than " .. (256^2) .. ".")
           return false
       end

       for i = 1, string.len(value) do
           self:addByte(value:byte(i))
       end
       return true
end


function ByteArray:insertBytes(bytes, pos, size)


      local pos = pos or #data + 1
      local data = (type(bytes) == "table") and bytes or {bytes}
      local size = size or #data

      self.size = self.size + size

      for i = 0, #data-1 do
          table.insert(self.data, pos, data[#bytes-i])
      end

      return true
end


function ByteArray:removeBytes(byte, pos)
      local byte = byte or 1
      local pos = pos or (self.size - byte) + 1


      for _ = 1, byte do 
          table.remove(self.data, pos)
      end

      self.readPos = self.readPos - byte
      self.size = self.size - byte

      return true
end




function ByteArray:removeU32(pos)
   return self:removeBytes(4, pos)
end


function ByteArray:removeU16(pos)
   return self:removeBytes(2, pos)
end


function ByteArray:removeByte(pos)
   return self:removeBytes(1, pos)
end

 

Alguns exemplos de uso:

 

packet = ByteArray:new()
packet:addU16(500)
packet:getU16(500)
packet:removeU16()
packet:addByte(5)


final_packet = ByteArray:new()
final_packet:addString("oi")
final_packet:insertBytes(packet.data, final_packet.size + 1)


print(final_packet:getString())
print(final_packet:getByte())

 

Old version: http://pastebin.com/BJEHG3Ky

Editado por Conde2

Compartilhar este post


Link para o post
Majesty    1755
Majesty

Obrigado pela contribuição.

 

 

Aprovado.

Compartilhar este post


Link para o post
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  
  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×