Skip to content

Instantly share code, notes, and snippets.

@nhiroki
Created November 12, 2011 18:23
Show Gist options
  • Save nhiroki/1360905 to your computer and use it in GitHub Desktop.
Save nhiroki/1360905 to your computer and use it in GitHub Desktop.
BitIO
#
# BitIO utility.
#
class BitIO
include Enumerable
attr_accessor :bytepos, :bitpos
def initialize(text)
@text = text
@bytepos = 0 # Current byte position.
@bitpos = -1 # Current bit position ([7,6,5,4,3,2,1,0]).
@buffer = 0 # Contains current byte.
end
def self.open(text)
self.new text
end
private
def readbuf
return @buffer = nil if @text.bytesize <= @bytepos
@buffer = @text.getbyte(@bytepos)
@bytepos += 1
@bitpos = 7
end
public
def eof?
readbuf if @bitpos < 0
@buffer == nil
end
# Reads a bit.
def getbit
readbuf if @bitpos < 0
return nil if @buffer == nil
mask = 0x1
bit = (@buffer >> @bitpos) & mask
@bitpos -= 1
bit.to_s
end
# Reads n bits.
def readbits(n)
ret = ""
n.times do
ret << getbit.to_s
end
ret
end
def write str
@text <<= str
end
def rewind
@bytepos = 0
@bitpos = -1
end
def each
while !eof? do
yield getbit
end
end
# def to_s
# @text
# end
end
=begin
puts "[a] %08b" % "a".getbyte(0)
puts "[b] %08b" % "b".getbyte(0)
puts "[c] %08b" % "c".getbyte(0)
print "\n"
bitio = BitIO.new("abc")
puts "Init \"abc\""
print "Read all: "
while (bit = bitio.getbit) != nil do
print bit
end
print "\n\n"
bitio.write("aa"); puts "write \"aa\""
print "Read all: ";
bitio.each do |b|
print b
end
print "\n\n"
bitio.rewind; puts "rewind"
print "Read all: "
bitio.each do |b|
print b
end
print "\n\n"
bitio.rewind; puts "rewind"
puts "Read 4 bits: #{bitio.readbits 4}"
puts "Read 8 bits: #{bitio.readbits 8}"
puts "Read 5 bits: #{bitio.readbits 5}"
=end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment