lua number & protobuf int32 int64 repeated issue: Value out of range
1.encoder.lua
function _VarintSize(value)
if value <= 0x7f then return 1 end
if value <= 0x3fff then return 2 end
if value <= 0x1fffff then return 3 end
if value <= 0xfffffff then return 4 end
return 5
end
function _SignedVarintSize(value)
if value < 0 then return 10 end
if value <= 0x7f then return 1 end
if value <= 0x3fff then return 2 end
if value <= 0x1fffff then return 3 end
if value <= 0xfffffff then return 4 end
return 5
end
改成
function _VarintSize(value)
if value <= 0x7f then return 1 end
if value <= 0x3fff then return 2 end
if value <= 0x1fffff then return 3 end
if value <= 0xfffffff then return 4 end
if value <= 0x7ffffffff then return 5 end
if value <= 0x3ffffffffff then return 6 end
if value <= 0x1ffffffffffff then return 7 end
if value <= 0xffffffffffffff then return 8 end
if value <= 0x7fffffffffffffff then return 9 end
return 10
end
function _SignedVarintSize(value)
if value < 0 then return 10 end
if value <= 0x7f then return 1 end
if value <= 0x3fff then return 2 end
if value <= 0x1fffff then return 3 end
if value <= 0xfffffff then return 4 end
if value <= 0x7ffffffff then return 5 end
if value <= 0x3ffffffffff then return 6 end
if value <= 0x1ffffffffffff then return 7 end
if value <= 0xffffffffffffff then return 8 end
if value <= 0x7fffffffffffffff then return 9 end
return 10
end
2.ware_format里 (非必要?)
local function _VarUInt64ByteSizeNoTag(uint64)
if uint64 <= 0x7f then return 1 end
if uint64 <= 0x3fff then return 2 end
if uint64 <= 0x1fffff then return 3 end
if uint64 <= 0xfffffff then return 4 end
return 5
end
改成
local function _VarUInt64ByteSizeNoTag(uint64)
if uint64 <= 0x7f then return 1 end
if uint64 <= 0x3fff then return 2 end
if uint64 <= 0x1fffff then return 3 end
if uint64 <= 0xfffffff then return 4 end
if uint64 <= 0x7ffffffff then return 5 end
if uint64 <= 0x3ffffffffff then return 6 end
if uint64 <= 0x1ffffffffffff then return 7 end
if uint64 <= 0xffffffffffffff then return 8 end
if uint64 <= 0x7fffffffffffffff then return 9 end
return 10
end
type_checkers.lua里 (这个范围是我们自己根据一些情况 设定了一个范围)
增加
function Int64ValueChecker()
local _MIN = -562949953421312
local _MAX = 562949953421312
return function(proposed_value)
if type(proposed_value) ~= 'number' then
error(string.format('%s has type %s, but expected one of: number',
proposed_value, type(proposed_value)))
end
if _MIN > proposed_value or proposed_value > _MAX then
error('Value out of range: ' .. proposed_value)
end
end
end
function Uint64ValueChecker(IntValueChecker)
local _MIN = 0
local _MAX = 1125899906842624
return function(proposed_value)
if type(proposed_value) ~= 'number' then
error(string.format('%s has type %s, but expected one of: number',
proposed_value, type(proposed_value)))
end
if _MIN > proposed_value or proposed_value > _MAX then
error('Value out of range: ' .. proposed_value)
end
end
end
4.protobuf.lua
里
[FieldDescriptor.CPPTYPE_INT64] = type_checkers.Int32ValueChecker(),
[FieldDescriptor.CPPTYPE_UINT64] = type_checkers.Uint32ValueChecker(),
改成
[FieldDescriptor.CPPTYPE_INT64] = type_checkers.Int64ValueChecker(),
[FieldDescriptor.CPPTYPE_UINT64] = type_checkers.Uint64ValueChecker(),
仅供参考
lua number & protobuf int32 int64 repeated issue: Value out of range1.encoder.luafunction _VarintSize(value)if value <= 0x7f then return 1 endif value <= 0x3fff then return 2 endif v...