Class: BinData::IO::Read
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
-
#initialize(io) ⇒ Read
constructor
A new instance of Read.
-
#offset ⇒ Object
Returns the current offset of the io stream.
-
#read_all_bytes ⇒ Object
Reads all remaining bytes from the stream.
-
#readbits(nbits, endian) ⇒ Object
Reads exactly
nbits
bits from the stream. -
#readbytes(n) ⇒ Object
Reads exactly
n
bytes fromio
. -
#reset_read_bits ⇒ Object
Discards any read bits so the stream becomes aligned at the next byte boundary.
-
#seekbytes(n) ⇒ Object
Seek
n
bytes from the current position in the io stream. -
#with_buffer(n) ⇒ Object
Sets a buffer of
n
bytes on the io stream.
Constructor Details
#initialize(io) ⇒ Read
Returns a new instance of Read.
241 242 243 244 245 246 247 248 |
# File 'lib/bindata/io.rb', line 241 def initialize(io) super(io) # bits when reading @rnbits = 0 @rval = 0 @rendian = nil end |
Instance Method Details
#offset ⇒ Object
Returns the current offset of the io stream. Offset will be rounded up when reading bitfields.
261 262 263 |
# File 'lib/bindata/io.rb', line 261 def offset offset_raw end |
#read_all_bytes ⇒ Object
Reads all remaining bytes from the stream.
282 283 284 285 |
# File 'lib/bindata/io.rb', line 282 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.
289 290 291 292 293 294 295 296 297 298 299 300 301 |
# File 'lib/bindata/io.rb', line 289 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.
276 277 278 279 |
# File 'lib/bindata/io.rb', line 276 def readbytes(n) reset_read_bits read(n) end |
#reset_read_bits ⇒ Object
Discards any read bits so the stream becomes aligned at the next byte boundary.
305 306 307 308 |
# File 'lib/bindata/io.rb', line 305 def reset_read_bits @rnbits = 0 @rval = 0 end |
#seekbytes(n) ⇒ Object
Seek n
bytes from the current position in the io stream.
266 267 268 269 |
# File 'lib/bindata/io.rb', line 266 def seekbytes(n) reset_read_bits seek(n) end |
#with_buffer(n) ⇒ 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.
252 253 254 255 256 257 |
# File 'lib/bindata/io.rb', line 252 def with_buffer(n) with_buffer_common(n) do yield read end end |