Vous est-il déjà arrivé d’écrire du code comme celui-ci ?
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 } "
C'est moche, viole DRY et ne ressemble pas à Ruby.
Il existe une meilleure façon. Voici comment écrire ce qui précède en utilisant 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 fournit un moyen déclaratif de lire et d'écrire des données binaires structurées.
Cela signifie que le programmeur spécifie quel est le format des données binaires et BinData détermine comment lire et écrire des données dans ce format. C'est une alternative plus simple (et plus lisible) aux méthodes #pack
et #unpack
de Ruby.
BinData facilite la création de nouveaux types de données. Il prend en charge tous les types de données primitifs courants que l'on trouve dans les formats de données binaires structurés. La prise en charge des champs dépendants et de longueur variable est intégrée.
$ gem install bindata
Manuel BinData.
Si vous avez des questions/rapports de bogues/suggestions, veuillez me contacter (Dion Mendel) par e-mail à [email protected]