Slide 1

Slide 1 text

Parsing and Writing Binary Data in Ruby Jan Krutisch @halfbyte [email protected]

Slide 2

Slide 2 text

señor developer

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

Protracker "mod" files

Slide 5

Slide 5 text

Binary Format

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

‣ Instrument Metadata ‣ Sample Data ‣ Pattern Data ‣ Sequence Data Mod File Contents

Slide 8

Slide 8 text

‣ Instrument Metadata ‣ Sample Data ‣ Pattern Data ‣ Sequence Data Mod File Contents Array of Structs (=Array of Hashes)

Slide 9

Slide 9 text

‣ Instrument Metadata ‣ Sample Data ‣ Pattern Data ‣ Sequence Data Mod File Contents Array of Structs (=Array of Hashes) Array of Blobs

Slide 10

Slide 10 text

‣ Instrument Metadata ‣ Sample Data ‣ Pattern Data ‣ Sequence Data Mod File Contents Array of Structs (=Array of Hashes) Array of Blobs Arrays of Arrays of Arrays of Structs

Slide 11

Slide 11 text

‣ Instrument Metadata ‣ Sample Data ‣ Pattern Data ‣ Sequence Data Mod File Contents Array of Structs (=Array of Hashes) Array of Blobs Arrays of Arrays of Arrays of Structs Array of Integers

Slide 12

Slide 12 text

Simple Approach

Slide 13

Slide 13 text

Serializer / Deserializer

Slide 14

Slide 14 text

Different Datatypes

Slide 15

Slide 15 text

Protracker Datatypes

Slide 16

Slide 16 text

Protracker Datatypes ‣ 8Bit signed binary blobs

Slide 17

Slide 17 text

Protracker Datatypes ‣ 8Bit signed binary blobs ‣ UInt8

Slide 18

Slide 18 text

Protracker Datatypes ‣ 8Bit signed binary blobs ‣ UInt8 ‣ UInt16 (Endianness?)

Slide 19

Slide 19 text

Protracker Datatypes ‣ 8Bit signed binary blobs ‣ UInt8 ‣ UInt16 (Endianness?) ‣ \0-Terminated/Padded Strings

Slide 20

Slide 20 text

Protracker Datatypes ‣ 8Bit signed binary blobs ‣ UInt8 ‣ UInt16 (Endianness?) ‣ \0-Terminated/Padded Strings ‣ Int4 (Yes, that‘s a signed halfbyte)

Slide 21

Slide 21 text

And this...

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

Procedural Mess

Slide 24

Slide 24 text

Declarative

Slide 25

Slide 25 text

gem "bindata"

Slide 26

Slide 26 text

class ProtrackerModule < BinData::Record endian :big string :name, :length => 20, :trim_padding => true array :samples, :type => Sample, :length => 31 uint8 :pattern_table_length uint8 :unused array :pattern_table, :type => :uint8, :initial_length => 128 [...]

Slide 27

Slide 27 text

class ProtrackerModule < BinData::Record endian :big string :name, :length => 20, :trim_padding => true array :samples, :type => Sample, :length => 31 uint8 :pattern_table_length uint8 :unused array :pattern_table, :type => :uint8, :initial_length => 128 [...]

Slide 28

Slide 28 text

class ProtrackerModule < BinData::Record endian :big string :name, :length => 20, :trim_padding => true array :samples, :type => Sample, :length => 31 uint8 :pattern_table_length uint8 :unused array :pattern_table, :type => :uint8, :initial_length => 128 [...]

Slide 29

Slide 29 text

class ProtrackerModule < BinData::Record endian :big string :name, :length => 20, :trim_padding => true array :samples, :type => Sample, :length => 31 uint8 :pattern_table_length uint8 :unused array :pattern_table, :type => :uint8, :initial_length => 128 [...]

Slide 30

Slide 30 text

class ProtrackerModule < BinData::Record endian :big string :name, :length => 20, :trim_padding => true array :samples, :type => Sample, :length => 31 uint8 :pattern_table_length uint8 :unused array :pattern_table, :type => :uint8, :initial_length => 128 [...]

Slide 31

Slide 31 text

array :patterns, :type => Pattern, :initial_length => lambda { pattern_table.max + 1 }

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

Demo

Slide 34

Slide 34 text

señor developer http://senordevelopershop.spreadshirt.de/ (europe) http://senordeveloper.spreadshirt.com/ (intl)