trainworld_computercraft/computer/0/apis/bitreader.lua
2025-07-03 01:23:46 +02:00

107 lines
No EOL
1.5 KiB
Lua

local bit = bit
local function readBit_b8(self)
if (self.current > 8) then
return false, false
end
self.current = self.current + 1
local v = bit.band(self._value, self._bits[self.current])
return self.current < 8, v > 0
end
local function new(self, value)
self.current = 0
self._value = value
end
function Bits8()
-- Represents a byte, allows reading a bit at a time.
local self = {}
self.current = 0
self._value = 0
self._bits = {128, 64, 32, 16, 8, 4, 2, 1}
self.readBit = readBit_b8
self.new = new
return self
end
local function readBit_br(self)
local s, v = self.cb:readBit()
if (not s) then
self.pointer = self.pointer + 1
self.cb:new(self.data[self.pointer])
end
return v
end
local function readBits(self, n)
local bt = self._bittable
for i = 1, n do
bt[i] = self:readBit()
end
for i = n+1, #bt do
bt[i] = nil
end
return bt
end
local function readNumber(self, n)
local m = 0
local t = self:readBits(n)
for i = 1, #t do
m = m * 2
if (t[i]) then
m = m + 1
end
end
return m
end
local function reset(self)
self.cb = Bits8()
self.pointer = 1
self.cb:new(self.data[self.pointer])
end
function BitReader(data)
-- Class to read bits individually from a table of bytes.
local self = {}
self.data = data
self.cb = Bits8()
self.pointer = 1
self.cb:new(self.data[self.pointer])
self.readBit = readBit_br
self.readBits = readBits
self.readNumber = readNumber
self.reset = reset
self._bittable = {}
return self
end