conversion to/from bytes and data buffer modules
This commit is contained in:
@@ -0,0 +1,148 @@
|
||||
local bit_converter = require "core:bit_converter"
|
||||
|
||||
-- Data buffer
|
||||
|
||||
local data_buffer = { }
|
||||
|
||||
function data_buffer.__call(bytes)
|
||||
return setmetatable({ pos = 1, bytes = bytes or { } }, { __index = data_buffer })
|
||||
end
|
||||
|
||||
-- Push functions
|
||||
|
||||
function data_buffer:put_byte(byte)
|
||||
if byte < 0 or byte > 255 then
|
||||
error("invalid byte")
|
||||
end
|
||||
|
||||
self.bytes[self.pos] = byte
|
||||
|
||||
self.pos = self.pos + 1
|
||||
end
|
||||
|
||||
function data_buffer:put_bytes(bytes)
|
||||
for i = 1, #bytes do
|
||||
self:put_byte(bytes[i])
|
||||
end
|
||||
end
|
||||
|
||||
function data_buffer:put_single(single)
|
||||
self:put_bytes(bit_converter.single_to_bytes(single))
|
||||
end
|
||||
|
||||
function data_buffer:put_double(double)
|
||||
self:put_bytes(bit_converter.double_to_bytes(double))
|
||||
end
|
||||
|
||||
function data_buffer:put_string(str)
|
||||
self:put_bytes(bit_converter.string_to_bytes(str))
|
||||
end
|
||||
|
||||
function data_buffer:put_bool(bool)
|
||||
self:put_byte(bit_converter.bool_to_byte(bool))
|
||||
end
|
||||
|
||||
function data_buffer:put_uint16(uint16)
|
||||
self:put_bytes(bit_converter.uint16_to_bytes(uint16))
|
||||
end
|
||||
|
||||
function data_buffer:put_uint32(uint32)
|
||||
self:put_bytes(bit_converter.uint32_to_bytes(uint32))
|
||||
end
|
||||
|
||||
function data_buffer:put_int16(int16)
|
||||
self:put_bytes(bit_converter.int16_to_bytes(int16))
|
||||
end
|
||||
|
||||
function data_buffer:put_int32(int32)
|
||||
self:put_bytes(bit_converter.int32_to_bytes(int32))
|
||||
end
|
||||
|
||||
function data_buffer:put_int64(int64)
|
||||
self:put_bytes(bit_converter.int64_to_bytes(int64))
|
||||
end
|
||||
|
||||
-- Get functions
|
||||
|
||||
function data_buffer:get_byte()
|
||||
local byte = self.bytes[self.pos]
|
||||
self.pos = self.pos + 1
|
||||
return byte
|
||||
end
|
||||
|
||||
function data_buffer:get_single()
|
||||
return bit_converter.bytes_to_single(self:get_bytes(4))
|
||||
end
|
||||
|
||||
function data_buffer:get_double()
|
||||
return bit_converter.bytes_to_double(self:get_bytes(8))
|
||||
end
|
||||
|
||||
function data_buffer:get_string()
|
||||
local len = self:get_bytes(4)
|
||||
local str = self:get_bytes(bit_converter.bytes_to_int32(len))
|
||||
local bytes = { }
|
||||
|
||||
for i = 1, #len do
|
||||
bytes[i] = len[i]
|
||||
end
|
||||
|
||||
for i = 1, #str do
|
||||
bytes[#bytes + 1] = str[i]
|
||||
end
|
||||
|
||||
return bit_converter.bytes_to_string(bytes)
|
||||
end
|
||||
|
||||
function data_buffer:get_bool()
|
||||
return bit_converter.byte_to_bool(self:get_byte())
|
||||
end
|
||||
|
||||
function data_buffer:get_int16()
|
||||
return bit_converter.bytes_to_int16(self:get_bytes(2))
|
||||
end
|
||||
|
||||
function data_buffer:get_int32()
|
||||
return bit_converter.bytes_to_int32(self:get_bytes(4))
|
||||
end
|
||||
|
||||
function data_buffer:get_int64()
|
||||
return bit_converter.bytes_to_int64(self:get_bytes(8))
|
||||
end
|
||||
|
||||
function data_buffer:size()
|
||||
return #self.bytes
|
||||
end
|
||||
|
||||
function data_buffer:get_bytes(len)
|
||||
if len == nil then
|
||||
return self.bytes
|
||||
else
|
||||
local bytes = { }
|
||||
|
||||
for i = 1, n do
|
||||
bytes[i] = self:get_byte()
|
||||
end
|
||||
|
||||
return bytes
|
||||
end
|
||||
end
|
||||
|
||||
function data_buffer:set_position(pos)
|
||||
self.pos = pos
|
||||
end
|
||||
|
||||
function data_buffer:set_bytes(bytes)
|
||||
for i = 1, #bytes do
|
||||
local byte = bytes[i]
|
||||
if byte < 0 or byte > 255 then
|
||||
error("invalid byte")
|
||||
end
|
||||
end
|
||||
|
||||
self.bytes = bytes
|
||||
end
|
||||
|
||||
setmetatable(data_buffer, data_buffer)
|
||||
|
||||
return data_buffer
|
||||
Reference in New Issue
Block a user