Class: BinData::IO::Read

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

Overview

Create a new IO Read wrapper around io. io must provide #read, #pos if reading the current stream position and #seek if setting the current stream position. 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.

M  byte1   L      M  byte2   L
S 76543210 S      S fedcba98 S
B          B      B          B

In big endian format:

readbits(6), readbits(5) #=> [765432, 10fed]

In little endian format:

readbits(6), readbits(5) #=> [543210, a9876]

Instance Method Summary collapse

Constructor Details

#initialize(io) ⇒ Read

Returns a new instance of Read.



173
174
175
176
177
178
179
180
# File 'lib/bindata/io.rb', line 173

def initialize(io)
  super(io)

  # bits when reading
  @rnbits  = 0
  @rval    = 0
  @rendian = nil
end

Instance Method Details

#offsetObject

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



193
194
195
# File 'lib/bindata/io.rb', line 193

def offset
  offset_raw
end

#read_all_bytesObject

Reads all remaining bytes from the stream.



218
219
220
221
# File 'lib/bindata/io.rb', line 218

def read_all_bytes
  reset_read_bits
  read
end

#readbits(nbits, endian) ⇒ Object

Reads exactly nbits bits from the stream. endian specifies whether the bits are stored in :big or :little endian format.



225
226
227
228
229
230
231
232
233
234
235
236
237
# File 'lib/bindata/io.rb', line 225

def readbits(nbits, endian)
  if @rendian != endian
    # don't mix bits of differing endian
    reset_read_bits
    @rendian = endian
  end

  if endian == :big
    read_big_endian_bits(nbits)
  else
    read_little_endian_bits(nbits)
  end
end

#readbytes(n) ⇒ Object

Reads exactly n bytes from io.

If the data read is nil an EOFError is raised.

If the data read is too short an IOError is raised.

Raises:

  • (EOFError)


208
209
210
211
212
213
214
215
# File 'lib/bindata/io.rb', line 208

def readbytes(n)
  reset_read_bits

  str = read(n)
  raise EOFError, "End of file reached" if str.nil?
  raise IOError, "data truncated" if str.size < n
  str
end

#reset_read_bitsObject

Discards any read bits so the stream becomes aligned at the next byte boundary.



241
242
243
244
# File 'lib/bindata/io.rb', line 241

def reset_read_bits
  @rnbits = 0
  @rval   = 0
end

#seekbytes(n) ⇒ Object

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



198
199
200
201
# File 'lib/bindata/io.rb', line 198

def seekbytes(n)
  reset_read_bits
  seek(n)
end

#with_buffer(n, &block) ⇒ Object

Sets a buffer of n bytes on the io stream. Any reading or seeking calls inside the block will be contained within this buffer.



184
185
186
187
188
189
# File 'lib/bindata/io.rb', line 184

def with_buffer(n, &block)
  with_buffer_common(n) do
    block.call
    read
  end
end