marlosgama

Untitled

Jun 14th, 2020
1,448
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 2.09 KB | None | 0 0
  1. #==============================================================================
  2. # ** Buffer
  3. #------------------------------------------------------------------------------
  4. #  Esta classe lê e escreve dados binários. Ela é utilizada
  5. # especialmente para reduzir a quantidade de bytes trocados
  6. # pelo cliente e servidor.
  7. #------------------------------------------------------------------------------
  8. #  Autor: Valentine
  9. #==============================================================================
  10.  
  11. class Buffer_Writer
  12.  
  13.   def initialize
  14.     @buffer = []
  15.     @pack = ''
  16.   end
  17.  
  18.   def write_byte(byte)
  19.     write(byte, 'c')
  20.   end
  21.  
  22.   def write_boolean(value)
  23.     write_byte(value ? 1 : 0)
  24.   end
  25.  
  26.   def write_short(short)
  27.     write(short, 's')
  28.   end
  29.  
  30.   def write_int(int)
  31.     write(int, 'i')
  32.   end
  33.  
  34.   def write_long(long)
  35.     # q representa um número de 64 bits, diferentemente
  36.     #de l que representa um número de 32 bits
  37.     write(long, 'q')
  38.   end
  39.  
  40.   def write_string(str)
  41.     write_short(str.bytesize)
  42.     str.each_byte { |c| write_byte(c) }
  43.   end
  44.  
  45.   def to_s
  46.     @buffer.pack(@pack)
  47.   end
  48.  
  49.   private
  50.  
  51.   def write(value, format)
  52.     @buffer << value
  53.     @pack << format
  54.   end
  55.  
  56. end
  57.  
  58. #==============================================================================
  59. # ** Buffer_Reader
  60. #==============================================================================
  61. class Buffer_Reader
  62.  
  63.   def initialize(str)
  64.     # O método to_a é usado, pois, nesta versão do Ruby,
  65.     #bytes retorna Enumerator em vez de Array
  66.     @bytes = str.bytes.to_a
  67.   end
  68.  
  69.   def read_byte
  70.     @bytes.shift
  71.   end
  72.  
  73.   def read_boolean
  74.     read_byte == 1
  75.   end
  76.  
  77.   def read_short
  78.     read(2, 's')
  79.   end
  80.  
  81.   def read_int
  82.     read(4, 'i')
  83.   end
  84.  
  85.   def read_long
  86.     read(8, 'q')
  87.   end
  88.  
  89.   def read_string
  90.     size = read_short
  91.     read(size, "A#{size}")
  92.   end
  93.  
  94.   def read_time
  95.     Time.new(read_short, read_byte, read_byte)
  96.   end
  97.  
  98.   private
  99.  
  100.   def read(n, format)
  101.     @bytes.shift(n).pack('C*').unpack(format)[0]
  102.   end
  103.  
  104. end
Advertisement
Add Comment
Please, Sign In to add comment