Вы когда-нибудь писали подобный код?
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 } "
Это уродливо, нарушает DRY и не похоже на Ruby.
Есть лучший способ. Вот как бы вы написали вышеизложенное, используя 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 предоставляет декларативный способ чтения и записи структурированных двоичных данных.
Это означает, что программист указывает формат двоичных данных, а BinData определяет , как читать и записывать данные в этом формате. Это более простая (и более читабельная) альтернатива рубиновым методам #pack
и #unpack
.
BinData упрощает создание новых типов данных. Он поддерживает все распространенные примитивные типы данных, которые встречаются в форматах структурированных двоичных данных. Встроена поддержка зависимых и переменных полей длины.
$ gem install bindata
Руководство по Биндата.
Если у вас есть какие-либо вопросы/отчеты об ошибках/предложения, свяжитесь со мной (Дион Мендель) по электронной почте[email protected].