Explorar o código

Functional Base64 prior to cleanup

Marcos Kirsch %!s(int64=9) %!d(string=hai) anos
pai
achega
b1f87f3ffa
Modificáronse 1 ficheiros con 31 adicións e 2 borrados
  1. 31 2
      b64.lua

+ 31 - 2
b64.lua

@@ -108,6 +108,34 @@ function enc(data)
 	return result
 end
 
+local function toBase64Byte(char)
+   ascii = string.byte(char, 1)
+   if ascii >= string.byte('A', 1) and ascii <= string.byte('Z', 1) then
+      return ascii - string.byte('A', 1)
+   elseif ascii >= string.byte('a', 1) and ascii <= string.byte('z', 1) then
+      return ascii - string.byte('a', 1) + 26
+   elseif ascii >= string.byte('0', 1) and ascii <= string.byte('9', 1) then
+      return ascii + 4
+   elseif ascii == string.byte('-', 1) then
+      return 62
+   elseif ascii == string.byte('_', 1) then
+      return 63
+   elseif ascii == string.byte('=', 1) then
+      return nil
+   else
+      return "ERROR! Char is invalid for Base64 encoding: "..char
+   end
+end
+
+print(toBase64Byte('A'))
+print(toBase64Byte('B'))
+print(toBase64Byte('C'))
+print(toBase64Byte('D'))
+print(toBase64Byte('a'))
+print(toBase64Byte('b'))
+print(toBase64Byte('c'))
+print(toBase64Byte('d'))
+
 -- decryption table
 local base64bytes = {
    ['A']=0,
@@ -183,8 +211,9 @@ 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(
+--		for char=1,4 do chars[char] = base64bytes[(string.sub(data,(dpos+char),(dpos+char)) or "=")] end
+		for char=1,4 do chars[char] = toBase64Byte((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))),