Lua:出现错误“尝试对本地变量'value'(空值)执行算术运算”。

我正在从这里 学习将base64转换成lua。 为什么我会得到错误

2013/12/02 04:46:06 [error] 6493#0: *1 lua entry thread aborted: runtime error: /home/django/core/lua/redis_cache.lua:34: attempt to perform arithmetic on local 'value' (a nil value)

我的.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))
点赞
用户828255
用户828255

你的算法在长度为4n+1data 上都失败了,因为你没有检查循环中的第二个字符是否为nil。为了解决这个问题,你需要添加类似于已有的chars[3]chars[4]检查的检查。

2013-12-02 13:52:41