Sobre:
Lê e escreve dados como valores binários.Script:
- Código:
#==============================================================================
# ** Buffer
#------------------------------------------------------------------------------
# Esta classe lê e escreve dados binários.
#------------------------------------------------------------------------------
# Autor: Valentine
#==============================================================================
class Buffer_Writer
def initialize
@buffer = []
@pack = ''
end
def write_byte(byte)
write(byte, 'c')
end
def write_boolean(value)
write_byte(value ? 1 : 0)
end
def write_short(short)
write(short, 's')
end
def write_float(float)
write(float, 'f')
end
def write_double(double)
write(double, 'd')
end
def write_int(int)
write(int, 'i')
end
def write_long(long)
# q representa um número de 64 bits, diferentemente
#de l que representa um número de 32 bits
write(long, 'q')
end
def write_string(str)
write_short(str.bytesize)
str.each_byte { |c| write_byte(c) }
end
def to_s
@buffer.pack(@pack)
end
private
def write(value, format)
@buffer << value
@pack << format
end
end
#==============================================================================
# ** Buffer_Reader
#==============================================================================
class Buffer_Reader
def initialize(str)
# O método to_a é usado, pois, nesta versão do Ruby,
#bytes retorna Enumerator em vez de Array
@bytes = str.bytes.to_a
end
def read_byte
@bytes.shift
end
def read_boolean
read_byte == 1
end
def read_short
read(2, 's')
end
def read_float
read(4, 'f')
end
def read_double
read(8, 'd')
end
def read_int
read(4, 'i')
end
def read_long
read(8, 'q')
end
def read_string
size = read_short
read(size, "A#{size}")
end
def read_time
Time.new(read_short, read_byte, read_byte)
end
private
def read(n, format)
@bytes.shift(n).pack('C*').unpack(format)[0]
end
end
Exemplos:
Escrevendo:- Código:
buffer_writer = Buffer_Writer.new
buffer_writer.write_string('texto')
buffer_writer.write_byte(1)
Lendo:
- Código:
buffer_reader = Buffer_Reader.new(buffer_writer.to_s)
text = buffer_reader.read_string
number = buffer_reader.read_byte
Créditos:
ValentineÚltima edição por Valentine em Qui Out 08, 2020 10:59 am, editado 8 vez(es)