Class: BinData::IO::Write

Inherits:
Object
  • Object
show all
Includes:
Common
Defined in:
lib/bindata/io.rb

Overview

Create a new IO Write wrapper around io. io must provide #write. If io is a string it will be automatically wrapped in an StringIO object.

The IO can handle bitstreams in either big or little endian format.

See IO::Read for more information.

Instance Method Summary collapse

Constructor Details

#initialize(io) ⇒ Write

Returns a new instance of Write.



372
373
374
375
376
377
378
# File 'lib/bindata/io.rb', line 372

def initialize(io)
  super(io)

  @wnbits  = 0
  @wval    = 0
  @wendian = nil
end

Instance Method Details

#flushbitsObject Also known as: flush

To be called after all writebits have been applied.



428
429
430
431
432
433
434
# File 'lib/bindata/io.rb', line 428

def flushbits
  raise "Internal state error nbits = #{@wnbits}" if @wnbits >= 8

  if @wnbits > 0
    writebits(0, 8 - @wnbits, @wendian)
  end
end

#offsetObject

Returns the current offset of the io stream. Offset will be rounded up when writing bitfields.



393
394
395
# File 'lib/bindata/io.rb', line 393

def offset
  offset_raw + (@wnbits > 0 ? 1 : 0)
end

#seekbytes(n) ⇒ Object

Seek n bytes from the current position in the io stream.



398
399
400
401
# File 'lib/bindata/io.rb', line 398

def seekbytes(n)
  flushbits
  seek(n)
end

#with_buffer(n) ⇒ Object

Sets a buffer of n bytes on the io stream. Any writes inside the block will be contained within this buffer. If less than n bytes are written inside the block, the remainder will be padded with ‘0’ bytes.



384
385
386
387
388
389
# File 'lib/bindata/io.rb', line 384

def with_buffer(n)
  with_buffer_common(n) do |_buf_start, buf_end|
    yield
    write("\0" * (buf_end - offset))
  end
end

#writebits(val, nbits, endian) ⇒ Object

Writes nbits bits from val to the stream. endian specifies whether the bits are to be stored in :big or :little endian format.



411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
# File 'lib/bindata/io.rb', line 411

def writebits(val, nbits, endian)
  if @wendian != endian
    # don't mix bits of differing endian
    flushbits
    @wendian = endian
  end

  clamped_val = val & mask(nbits)

  if endian == :big
    write_big_endian_bits(clamped_val, nbits)
  else
    write_little_endian_bits(clamped_val, nbits)
  end
end

#writebytes(str) ⇒ Object

Writes the given string of bytes to the io stream.



404
405
406
407
# File 'lib/bindata/io.rb', line 404

def writebytes(str)
  flushbits
  write(str)
end