Você já se pegou escrevendo código como este?
io = File . open ( ... )
len = io . read ( 2 ) . unpack ( "v" )
name = io . read ( len )
width , height = io . read ( 8 ) . unpack ( "VV" )
puts "Rectangle #{ name } is #{ width } x #{ height } "
É feio, viola DRY e não parece Ruby.
Existe uma maneira melhor. Veja como você escreveria o texto acima usando BinData.
class Rectangle < BinData :: Record
endian :little
uint16 :len
string :name , :read_length => :len
uint32 :width
uint32 :height
end
io = File . open ( ... )
r = Rectangle . read ( io )
puts "Rectangle #{ r . name } is #{ r . width } x #{ r . height } "
BinData fornece uma maneira declarativa de ler e gravar dados binários estruturados.
Isso significa que o programador especifica qual é o formato dos dados binários e BinData descobre como ler e gravar dados nesse formato. É uma alternativa mais fácil (e mais legível) aos métodos #pack
e #unpack
do Ruby.
BinData facilita a criação de novos tipos de dados. Ele suporta todos os tipos de dados primitivos comuns encontrados em formatos de dados binários estruturados. O suporte para campos dependentes e de comprimento variável está integrado.
$ gem install bindata
Manual BinData.
Se você tiver alguma dúvida/relatório de bugs/sugestão, entre em contato comigo (Dion Mendel) pelo e-mail [email protected]