Blame view

src/shared/base64.lua 4.28 KB
8583f6ee   chenyueqi   动态屏蔽字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
  local base64 = {}
  local string = string
  
  base64.__code = {
             'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
             'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
             'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
             'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/',
         };
  base64.__decode = {}
  for k,v in pairs(base64.__code) do
     base64.__decode[string.byte(v,1)] = k - 1
  end
  
  function base64.encode(text)
      local len = string.len(text)
      local left = len % 3
      len = len - left
      local res = {}
      local index  = 1
      for i = 1, len, 3 do
         local a = string.byte(text, i )
         local b = string.byte(text, i + 1)
         local c = string.byte(text, i + 2)
         -- num = a<<16 + b<<8 + c
         local num = a * 65536 + b * 256 + c 
         for j = 1, 4 do
             --tmp = num >> ((4 -j) * 6)
             local tmp = math.floor(num / (2 ^ ((4-j) * 6)))
             --curPos = tmp&0x3f
             local curPos = tmp % 64 + 1
             res[index] = base64.__code[curPos]
             index = index + 1
         end
      end
  
      if left == 1 then
         base64.__left1(res, index, text, len)
      elseif left == 2 then
         base64.__left2(res, index, text, len)       
      end
      return table.concat(res)
  end
  
  function base64.__left2(res, index, text, len)
      local num1 = string.byte(text, len + 1)
      num1 = num1 * 1024 --lshift 10 
      local num2 = string.byte(text, len + 2)
      num2 = num2 * 4 --lshift 2 
      local num = num1 + num2
     
      local tmp1 = math.floor(num / 4096) --rShift 12
      local curPos = tmp1 % 64 + 1
      res[index] = base64.__code[curPos]
      
      local tmp2 = math.floor(num / 64)
      curPos = tmp2 % 64 + 1
      res[index + 1] = base64.__code[curPos]
  
      curPos = num % 64 + 1
      res[index + 2] = base64.__code[curPos]
      
      res[index + 3] = "=" 
  end
  
  function base64.__left1(res, index,text, len)
      local num = string.byte(text, len + 1)
      num = num * 16 
      
      tmp = math.floor(num / 64)
      local curPos = tmp % 64 + 1
      res[index ] = base64.__code[curPos]
      
      curPos = num % 64 + 1
      res[index + 1] = base64.__code[curPos]
      
      res[index + 2] = "=" 
      res[index + 3] = "=" 
  end
  
  function base64.decode(text)
      local len = string.len(text)
      local left = 0 
      if string.sub(text, len - 1) == "==" then
         left = 2 
         len = len - 4
      elseif string.sub(text, len) == "=" then
         left = 1
         len = len - 4
      end
  
      local res = {}
      local index = 1
      local decode = base64.__decode
      for i =1, len, 4 do
         local a = decode[string.byte(text,i    )] 
         local b = decode[string.byte(text,i + 1)] 
         local c = decode[string.byte(text,i + 2)] 
         local d = decode[string.byte(text,i + 3)]
  
         --num = a<<18 + b<<12 + c<<6 + d
         local num = a * 262144 + b * 4096 + c * 64 + d
         
         local e = string.char(num % 256)
         num = math.floor(num / 256)
         local f = string.char(num % 256)
         num = math.floor(num / 256)
         res[index ] = string.char(num % 256)
         res[index + 1] = f
         res[index + 2] = e
         index = index + 3
      end
  
      if left == 1 then
         base64.__decodeLeft1(res, index, text, len)
      elseif left == 2 then
         base64.__decodeLeft2(res, index, text, len)
      end
      return table.concat(res)
  end
  
  function base64.__decodeLeft1(res, index, text, len)
      local decode = base64.__decode
      local a = decode[string.byte(text, len + 1)] 
      local b = decode[string.byte(text, len + 2)] 
      local c = decode[string.byte(text, len + 3)] 
      local num = a * 4096 + b * 64 + c
      
      local num1 = math.floor(num / 1024) % 256
      local num2 = math.floor(num / 4) % 256
      res[index] = string.char(num1)
      res[index + 1] = string.char(num2)
  end
  
  function base64.__decodeLeft2(res, index, text, len)
      local decode = base64.__decode
      local a = decode[string.byte(text, len + 1)] 
      local b = decode[string.byte(text, len + 2)]
      local num = a * 64 + b
      num = math.floor(num / 16)
      res[index] = string.char(num)
  end
  
  function base64.test()
      local data = "a\193\207="
      local abc = base64.encode(data)
      print(abc)
  
      def = base64.decode(abc)
      if def == data then
         print("yes")
      end
  end
  
  return base64