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
nbitsbits from the stream. -
#readbytes(n) ⇒ Object
Reads exactly
nbytes fromio. -
#reset_read_bits ⇒ Object
Discards any read bits so the stream becomes aligned at the next byte boundary.
-
#seekbytes(n) ⇒ Object
Seek
nbytes from the current position in the io stream. -
#with_buffer(n, &block) ⇒ Object
Sets a buffer of
nbytes on the io stream.
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
#offset ⇒ Object
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_bytes ⇒ Object
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.
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_bits ⇒ Object
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 |