Lua:获取错误“;尝试在本地';价值';(无价值)“;

Lua:获取错误“;尝试在本地';价值';(无价值)“;,lua,Lua,我正在学习从base64转换成lua。 为什么我会出错 2013/12/02 04:46:06[错误]6493#0:*1 lua条目线程中止:运行时错误:/home/django/core/lua/redis_缓存。lua:34:尝试对本地“值”(零值)执行算术 我的.lua文件 local data, err = red:get('session:' .. sessionid) ngx.log(ngx.ALERT, data) local function lsh(value,shift)

我正在学习从base64转换成lua。 为什么我会出错

2013/12/02 04:46:06[错误]6493#0:*1 lua条目线程中止:运行时错误:/home/django/core/lua/redis_缓存。lua:34:尝试对本地“值”(零值)执行算术

我的.lua文件

local data, err = red:get('session:' .. sessionid)
ngx.log(ngx.ALERT, data)

local function lsh(value,shift)
        return (value*(2^shift)) % 256
end

function rsh(value,shift)
        return math.floor(value/2^shift) % 256
end

function bit(x,b)
        return (x % 2^b - x % 2^(b-1) > 0)
end


function lor(x,y)
        result = 0
        for p=1,8 do result = result + (((bit(x,p) or bit(y,p)) == true) and 2^(p-1) or 0) end
        return result
end


local base64bytes = {['A']=0,['B']=1,['C']=2,['D']=3,['E']=4,['F']=5,['G']=6,['H']=7,['I']=8,['J']=9,['K']=10,['L']=11,['M']=12,['N']=13,['O']=14,['P']=15,['Q']=16,['R']=17,['S']=18,['T']=19,['U']=20,['V']=21,['W']=22,['X']=23,['Y']=24,['Z']=25,['a']=26,['b']=27,['c']=28,['d']=29,['e']=30,['f']=31,['g']=32,['h']=33,['i']=34,['j']=35,['k']=36,['l']=37,['m']=38,['n']=39,['o']=40,['p']=41,['q']=42,['r']=43,['s']=44,['t']=45,['u']=46,['v']=47,['w']=48,['x']=49,['y']=50,['z']=51,['0']=52,['1']=53,['2']=54,['3']=55,['4']=56,['5']=57,['6']=58,['7']=59,['8']=60,['9']=61,['-']=62,['_']=63,['=']=nil}

local function dec(data)
        local chars = {}
        local result=""
        for dpos=0,string.len(data)-1,4 do
                for char=1,4 do chars[char] = base64bytes[(string.sub(data,(dpos+char),(dpos+char)) or "=")] end
                result = string.format('%s%s%s%s',result,string.char(lor(lsh(chars[1],2), rsh(chars[2],4))),(chars[3] ~= nil) and string.char(lor(lsh(chars[2],4), rsh(chars[3],2))) or "",(chars[4] ~= nil) and string.char(lor(lsh(chars[3],6) % 192, (chars[4]))) or "")
        end
        return result
end


ngx.say(dec(data))

对于长度为
4n+1
的每个
数据
,您的算法都会失败,因为您没有检查循环中的第二个字符是否为
nil
。要解决这个问题,您需要添加一个类似于您已经为
chars[3]
chars[4]
添加的检查,因为您没有检查循环中的第二个字符是否为
nil
,所以对于长度
4n+1
的每个
数据,您的算法都会失败。要解决此问题,您需要添加一个类似于您已经为
chars[3]
chars[4]
添加的检查