366 lines
13 KiB
Lua
366 lines
13 KiB
Lua
do
|
||
require("public.class")
|
||
require("bio.BioType")
|
||
BioInputStream = {}
|
||
|
||
local B2Type = BioType.B2Type;
|
||
local IntB2TypeValueMap = BioType.IntB2TypeValueMap;
|
||
local StringB2TypeLenMap = BioType.StringB2TypeLenMap
|
||
local MapB2TypeSizeMap = BioType.MapB2TypeSizeMap
|
||
local ListB2TypeSizeMap = BioType.ListB2TypeSizeMap
|
||
|
||
|
||
local type = type
|
||
local sub = string.sub
|
||
local strbyte = string.byte
|
||
local strchar = string.char
|
||
|
||
--===================================================
|
||
--===================================================
|
||
--===================================================
|
||
-- 数据流
|
||
LuaB2InputStream = class("LuaB2InputStream");
|
||
function LuaB2InputStream:ctor(v)
|
||
self.bytes = v;
|
||
self.pos = 1;
|
||
end
|
||
|
||
function LuaB2InputStream:init(v)
|
||
self.bytes = v;
|
||
self.pos = 1;
|
||
end
|
||
|
||
function LuaB2InputStream:readByte()
|
||
local ret = strbyte(self.bytes, self.pos);
|
||
self.pos = self.pos + 1;
|
||
return ret;
|
||
end
|
||
|
||
function LuaB2InputStream:readBytes(len)
|
||
local ret = strbyte(self.bytes, self.pos, self.pos + len - 1);
|
||
self.pos = self.pos + len;
|
||
return ret;
|
||
end
|
||
|
||
function LuaB2InputStream:readString(len)
|
||
local ret = sub(self.bytes, self.pos, self.pos + len - 1);
|
||
self.pos = self.pos + len;
|
||
return ret;
|
||
end
|
||
|
||
function LuaB2InputStream:release()
|
||
self.bytes = nil;
|
||
self.pos = 1;
|
||
end
|
||
--===================================================
|
||
--===================================================
|
||
--===================================================
|
||
---public Void readObject (LuaB2InputStream s)
|
||
---@param optional LuaB2InputStream s
|
||
--[[
|
||
local is = LuaB2InputStream.new(os:toBytes());
|
||
local result = BioInputStream.readObject(is)
|
||
--]]
|
||
function BioInputStream.readObject (s)
|
||
local tag = BioInputStream.ReadByteTag(s);
|
||
if tag == B2Type.NULL then
|
||
return nil;
|
||
else
|
||
-- decode map
|
||
local mapSize = MapB2TypeSizeMap[tag]
|
||
if mapSize then
|
||
return BioInputStream.readMap(s, mapSize);
|
||
elseif tag == B2Type.HASHTABLE then
|
||
local len = BioInputStream.readInt(s);
|
||
return BioInputStream.readMap(s, len);
|
||
end
|
||
end
|
||
|
||
-- decode int
|
||
local intVal = IntB2TypeValueMap[tag]
|
||
if intVal then
|
||
return intVal;
|
||
elseif tag == B2Type.INT_N1 then
|
||
return -1;
|
||
elseif tag == B2Type.INT_8B then
|
||
local int = 0;
|
||
local int0 = BioInputStream.ReadByte(s)
|
||
if int0 >= 128 then
|
||
--字节是负数,里面存放的1字节是负数的补码,比如读出来是128, 128=1000 0000,对应signed char 是 -127,而127=0111 1111
|
||
int = int0 - 256;
|
||
else
|
||
int = int0;
|
||
end
|
||
return int;
|
||
elseif tag == B2Type.INT_16B then
|
||
local int = 0;
|
||
--INT_16B
|
||
local int0 = BioInputStream.ReadByte(s)
|
||
local int1 = BioInputStream.ReadByte(s)
|
||
if int0 >= 128 then
|
||
--字节是负数,里面存放的2字节是负数的补码
|
||
int = (int0 * 256 + int1) - 65536;
|
||
else
|
||
int = (int0 * 256 + int1);
|
||
end
|
||
return int;
|
||
elseif tag == B2Type.INT_32B then
|
||
local int = 0;
|
||
--INT_32B
|
||
local int0 = BioInputStream.ReadByte(s)
|
||
local int1 = BioInputStream.ReadByte(s)
|
||
local int2 = BioInputStream.ReadByte(s)
|
||
local int3 = BioInputStream.ReadByte(s)
|
||
--字节是负数,里面存放的4字节是负数的补码
|
||
if int0 >= 128 then
|
||
int = (int0 * 16777216 + int1 * 65536 + int2 * 256 + int3) - 4294967296;
|
||
else
|
||
int = (int0 * 16777216 + int1 * 65536 + int2 * 256 + int3);
|
||
end
|
||
return int;
|
||
end
|
||
|
||
-- decode string
|
||
local strLen = StringB2TypeLenMap[tag]
|
||
if strLen then
|
||
return s:readString(strLen);
|
||
elseif tag == B2Type.STR then
|
||
strLen = BioInputStream.readInt(s);
|
||
return s:readString(strLen);
|
||
end
|
||
|
||
if tag == B2Type.BOOLEAN_TRUE then
|
||
return true;
|
||
elseif tag == B2Type.BOOLEAN_FALSE then
|
||
return false;
|
||
elseif tag == B2Type.BYTE_0 then
|
||
return 0;
|
||
elseif tag == B2Type.BYTE then
|
||
return BioInputStream.ReadByte(s);
|
||
elseif tag == B2Type.BYTES_0 then
|
||
return 0;
|
||
elseif tag == B2Type.BYTES then
|
||
local len = BioInputStream.readInt(s);
|
||
return BioInputStream.ReadBytes(s, len);
|
||
end
|
||
|
||
-- decode list
|
||
local listLen = ListB2TypeSizeMap[tag]
|
||
if listLen then
|
||
return BioInputStream.readList(s, listLen);
|
||
elseif tag == B2Type.VECTOR then
|
||
local len = BioInputStream.readInt(s);
|
||
return BioInputStream.readList(s, len);
|
||
end
|
||
|
||
if tag == B2Type.SHORT_0 then
|
||
return 0;
|
||
elseif tag == B2Type.SHORT_8B then
|
||
local int = 0;
|
||
local int0 = BioInputStream.ReadByte(s)
|
||
if int0 >= 128 then
|
||
--字节是负数,里面存放的1字节是负数的补码,比如读出来是128, 128=1000 0000,对应signed char 是 -127,而127=0111 1111
|
||
int = int0 - 256;
|
||
else
|
||
int = int0;
|
||
end
|
||
return int;
|
||
elseif tag == B2Type.SHORT_16B then
|
||
local int = 0;
|
||
--INT_16B
|
||
local int0 = BioInputStream.ReadByte(s)
|
||
local int1 = BioInputStream.ReadByte(s)
|
||
if int0 >= 128 then
|
||
--字节是负数,里面存放的2字节是负数的补码
|
||
int = (int0 * 256 + int1) - 65536;
|
||
else
|
||
int = (int0 * 256 + int1);
|
||
end
|
||
return int;
|
||
elseif tag == B2Type.LONG_0 then
|
||
return 0;
|
||
elseif tag == B2Type.LONG_8B then
|
||
local int = 0;
|
||
local int0 = BioInputStream.ReadByte(s)
|
||
if int0 >= 128 then
|
||
--字节是负数,里面存放的1字节是负数的补码,比如读出来是128, 128=1000 0000,对应signed char 是 -127,而127=0111 1111
|
||
int = int0 - 256;
|
||
else
|
||
int = int0;
|
||
end
|
||
return int;
|
||
elseif tag == B2Type.LONG_16B then
|
||
local int = 0;
|
||
--INT_16B
|
||
local int0 = BioInputStream.ReadByte(s)
|
||
local int1 = BioInputStream.ReadByte(s)
|
||
if int0 >= 128 then
|
||
--字节是负数,里面存放的2字节是负数的补码
|
||
int = (int0 * 256 + int1) - 65536;
|
||
else
|
||
int = (int0 * 256 + int1);
|
||
end
|
||
return int;
|
||
elseif tag == B2Type.LONG_32B then
|
||
local int = 0;
|
||
--INT_32B
|
||
local int0 = BioInputStream.ReadByte(s)
|
||
local int1 = BioInputStream.ReadByte(s)
|
||
local int2 = BioInputStream.ReadByte(s)
|
||
local int3 = BioInputStream.ReadByte(s)
|
||
--字节是负数,里面存放的4字节是负数的补码
|
||
if int0 >= 128 then
|
||
int = (int0 * 16777216 + int1 * 65536 + int2 * 256 + int3) - 4294967296;
|
||
else
|
||
int = (int0 * 16777216 + int1 * 65536 + int2 * 256 + int3);
|
||
end
|
||
return int;
|
||
elseif tag == B2Type.LONG_64B then
|
||
local int = 0
|
||
local int0 = BioInputStream.ReadByte(s)
|
||
local int1 = BioInputStream.ReadByte(s)
|
||
local int2 = BioInputStream.ReadByte(s)
|
||
local int3 = BioInputStream.ReadByte(s)
|
||
local int4 = BioInputStream.ReadByte(s)
|
||
local int5 = BioInputStream.ReadByte(s)
|
||
local int6 = BioInputStream.ReadByte(s)
|
||
local int7 = BioInputStream.ReadByte(s)
|
||
--字节是负数,里面存放的4字节是负数的补码
|
||
if int0 >= 128 then
|
||
--? 1 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 = (9223372036854775807 * 4 + 3) ,
|
||
--lua里表示不出来了,只能这样写。
|
||
--实际上 大于9007199254740991(52bit) 的 long long 64在lua这边已经不是精确值了
|
||
int = (int0 * 72057594037927936 + int1 * 281474976710656 + int2 * 1099511627776 + int3 * 4294967296 + int4 * 16777216 + int5 * 65536 + int6 * 256 + int7) - (9223372036854775807 * 4 + 3);
|
||
else
|
||
int = (int0 * 72057594037927936 + int1 * 281474976710656 + int2 * 1099511627776 + int3 * 4294967296 + int4 * 16777216 + int5 * 65536 + int6 * 256 + int7)
|
||
end
|
||
return int
|
||
elseif tag == B2Type.DOUBLE_0 then
|
||
return 0;
|
||
elseif tag == B2Type.DOUBLE_64B then
|
||
local str = BioInputStream.readString(s)
|
||
return tonumber(str);
|
||
elseif tag == B2Type.INT_B2 then
|
||
return BioInputStream.readInt(s);
|
||
else
|
||
--//throw new IOException("unknow tag error then" + tag);
|
||
print("bio2 unknon type then==" .. tostring(tag));
|
||
end
|
||
return 0;
|
||
end
|
||
|
||
function BioInputStream.ReadByte(s)
|
||
if s == nil then
|
||
return nil;
|
||
end
|
||
return s:readByte();
|
||
end
|
||
|
||
function BioInputStream.ReadByteTag(s)
|
||
if s == nil then
|
||
return nil;
|
||
end
|
||
local int0 = s:readByte()
|
||
local int = 0;
|
||
if int0 >= 128 then
|
||
--字节是负数,里面存放的1字节是负数的补码,比如读出来是128, 128=1000 0000,对应signed char 是 -127,而127=0111 1111
|
||
int = int0 - 256;
|
||
else
|
||
int = int0;
|
||
end
|
||
return int;
|
||
end
|
||
|
||
function BioInputStream.ReadBytes(s, len)
|
||
return s:readBytes(len);
|
||
end
|
||
|
||
function BioInputStream.readMap(s, n)
|
||
if n == nil or n <= 0 then
|
||
return {}
|
||
end
|
||
|
||
local ret = {};
|
||
for i = 1, n do
|
||
local key = BioInputStream.readObject(s);
|
||
local val = BioInputStream.readObject(s);
|
||
ret [key] = val;
|
||
end
|
||
return ret;
|
||
end
|
||
|
||
function BioInputStream.readString(s)
|
||
local tag = BioInputStream.ReadByteTag(s);
|
||
local strLen = StringB2TypeLenMap[tag]
|
||
if strLen then
|
||
return s:readString(strLen)
|
||
elseif tag == B2Type.STR then
|
||
strLen = BioInputStream.readInt(s);
|
||
return s:readString(strLen)
|
||
end
|
||
return "";
|
||
end
|
||
|
||
function BioInputStream.readInt(s)
|
||
local tag = BioInputStream.ReadByteTag(s);
|
||
local intVal = IntB2TypeValueMap[tag]
|
||
if intVal then
|
||
return intVal;
|
||
elseif tag == B2Type.INT_N1 then
|
||
return -1;
|
||
elseif tag == B2Type.INT_8B then
|
||
local int = 0;
|
||
local int0 = BioInputStream.ReadByte(s)
|
||
if int0 >= 128 then
|
||
--字节是负数,里面存放的1字节是负数的补码,比如读出来是128, 128=1000 0000,对应signed char 是 -127,而127=0111 1111
|
||
int = int0 - 256;
|
||
else
|
||
int = int0;
|
||
end
|
||
return int;
|
||
elseif tag == B2Type.INT_16B then
|
||
local int = 0;
|
||
--INT_16B
|
||
local int0 = BioInputStream.ReadByte(s)
|
||
local int1 = BioInputStream.ReadByte(s)
|
||
if int0 >= 128 then
|
||
--字节是负数,里面存放的2字节是负数的补码
|
||
int = (int0 * 256 + int1) - 65536;
|
||
else
|
||
int = (int0 * 256 + int1);
|
||
end
|
||
return int;
|
||
elseif tag == B2Type.INT_32B then
|
||
local int = 0;
|
||
--INT_32B
|
||
local int0 = BioInputStream.ReadByte(s)
|
||
local int1 = BioInputStream.ReadByte(s)
|
||
local int2 = BioInputStream.ReadByte(s)
|
||
local int3 = BioInputStream.ReadByte(s)
|
||
--字节是负数,里面存放的4字节是负数的补码
|
||
if int0 >= 128 then
|
||
int = (int0 * 16777216 + int1 * 65536 + int2 * 256 + int3) - 4294967296;
|
||
else
|
||
int = (int0 * 16777216 + int1 * 65536 + int2 * 256 + int3);
|
||
end
|
||
return int;
|
||
end
|
||
return 0;
|
||
end
|
||
|
||
function BioInputStream.readList(s, n)
|
||
if n == nil or n <= 0 then
|
||
return {}
|
||
end
|
||
|
||
local ret = {};
|
||
for i = 1, n do
|
||
local val = BioInputStream.readObject(s);
|
||
table.insert(ret, val);
|
||
end
|
||
return ret;
|
||
end
|
||
--------------------------------------------
|
||
return BioInputStream;
|
||
end
|