class Ronin::Support::Binary::Union

Generic Binary Union class.

@note This class provides lazy memory mapped access to an underlying buffer. This means values are decoded/encoded each time they are read or written to.

## Examples

### Defining Fields

class MyUnion < Ronin::Support::Binary::Union

  member :c, :char
  member :i, :int16
  member :u, :uint32

end

### Initializing Fields

union   = MyUnion.new
union.i = -1

union = MyUnion.new(i: -1)

### Inheriting Unions

class MyUnion < Ronin::Support::Binary::Union

  member :c, :char
  member :i, :int16
  member :u, :uint32

end

class MyUnion2 < MyUnion

  member :f, :float32
  member :d, :float64

end

union   = MyUnion.new
union.i = -1

union2   = MyUnion.new
union2.i = -1
union2.d = 1.123

### Packing Unions

class MyUnion < Ronin::Support::Binary::Union

  member :c, :char
  member :i, :int16
  member :u, :uint32

end

union = MyUnion.new
union.u = 0x11111111
union.i = -1
union.pack
# => "\xFF\xFF\x11\x11"

### Unpacking Unions

class MyUnion < Ronin::Support::Binary::Union

  member :c, :char
  member :i, :int32
  member :u, :uint32

end

union = MyUnion.unpack("\xFF\xFF\x11\x11")
union.c
# => "\xFF"
union.i
# => -1
union.u
# => 286392319

### Array Fields

class MyUnion < Ronin::Support::Binary::Union

  member :c, :char
  member :i, :int16
  member :u, :uint32
  member :nums, [:uint8, 10]

end

union = MyUnion.new
union.nums = [0x01, 0x02, 0x03, 0x04]
union.pack
# => "\x01\x02\x03\x04\x00\x00\x00\x00\x00\x00"

### Unbounded Array Fields

class MyUnion < Ronin::Support::Binary::Union

  member :c, :char
  member :i, :int16
  member :u, :uint32
  member :payload, (:uint8..)

end

union = MyUnion.new
union.payload = [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]
union.pack
# => "\x01\x02\x03\x04\x05\x06\a\b"

### Default Endianness

class MyUnion < Ronin::Support::Binary::Union

  endian :big

  member :c, :char
  member :i, :int32
  member :u, :uint32

end

union = MyUnion.new(u: 0xaabbccdd)
union.pack
# => "\xAA\xBB\xCC\xDD"

@api public