lua实现base64编码解码

base64 = {}

local __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‘, ‘+‘, ‘/‘,

}

local __ASCII_CODE = {

[65]=0,[66]=1,[67]=2,[68]=3,[69]=4,[70]=5,[71]=6,[72]=7,[73]=8,[74]=9,[75]=10,

[76]=11,[77]=12,[78]=13,[79]=14,[80]=15,[81]=16,[82]=17,[83]=18,[84]=19,[85]=20,[86]=21,

[87]=22,[88]=23,[89]=24,[90]=25,[97]=26,[98]=27,[99]=28,[100]=29,[101]=30,[102]=31,[103]=32,

[104]=33,[105]=34,[106]=35,[107]=36,[108]=37,[109]=38,[110]=39,[111]=40,[112]=41,[113]=42,[114]=43,

[115]=44,[116]=45,[117]=46,[118]=47,[119]=48,[120]=49,[121]=50,[122]=51,[48]=52,[49]=53,[50]=54,

[51]=55,[52]=56,[53]=57,[54]=58,[55]=59,[56]=60,[57]=61,[43]=62,[47]=63,

}

--encode

function base64.encode(text)

local len = string.len(text)

local residual = len % 3

len = len - residual

local index = 1

local ret = {}

--处理正好转换的部分

for i =1,len,3 do

local t1 = string.byte(text,i)

local t2 = string.byte(text,i+1)

local t3 = string.byte(text,i+2)

--第一个字符左移16位,第二个8位,第三个0位

local num = t1*65536 + t2*256 + t3

for j = 3,0,-1 do

--右移移18、12、6、0位

local tmp = math.floor(num/(2^(j*6)))

local pos = tmp%64 + 1

ret[index] = __CODE[pos]

index = index + 1

end

end

--处理不能正好转换的部分

if residual == 1 then

local num = string.byte(text,len+1)

--左移4位,总共占8+4=12位,编码位2个base64字符

num = num * 16

--右移6位

local pos = math.floor(num/64)%64 + 1

ret[index] = __CODE[pos]

pos = num%64+1

ret[index+1] = __CODE[pos]

ret[index+2] = ‘=‘

ret[index+3] = ‘=‘

elseif residual ==2 then

local num1 = string.byte(text,len+1)

local num2 = string.byte(text,len+2)

--num1左移10位,num2左移2位

local num = num1*1024 + num2*4

--右移12位

local pos = math.floor(num/4096) % 64 + 1

ret[index] = __CODE[pos]

--右移6位

pos = math.floor(num/64) %64 + 1

ret[index+1] = __CODE[pos]

pos = num%64 + 1

ret[index+2] = __CODE[pos]

ret[index+3] = ‘=‘

end

return table.concat(ret)

end

--decode

function base64.decode(text)

local len = string.len(text)

if(len%4 ~= 0) then

return nil

end

local residual = 0

if string.sub(text,len-1) == ‘==‘ then

residual = 2

len = len - 4

elseif string.sub(text,len) == ‘=‘ then

residual = 1

len = len - 4

end

local index = 1

local ret = {}

--处理正好转换的部分

for i = 1,len,4 do

local t1 = __ASCII_CODE[string.byte(text,i)]

local t2 = __ASCII_CODE[string.byte(text,i+1)]

local t3 = __ASCII_CODE[string.byte(text,i+2)]

local t4 = __ASCII_CODE[string.byte(text,i+3)]

local num = t1*262144 + t2*4096 + t3*64 + t4

local t5 = string.char(num%256)

num = math.floor(num/256)

local t6 = string.char(num%256)

num = math.floor(num/256)

local t7 = string.char(num%256)

ret[index] = t7

ret[index+1] = t6

ret[index+2] = t5

index = index+3

end

--处理不能正好转换的部分

if residual == 1 then

local t8 = __ASCII_CODE[string.byte(text,len+1)]

local t9 = __ASCII_CODE[string.byte(text,len+2)]

local t10 = __ASCII_CODE[string.byte(text,len+3)]

local num = t8*4096 + t9*64 + t10

local pos = math.floor(num/1024) % 256

ret[index] = string.char(pos)

pos = math.floor(num/4) % 256

ret[index+1] = string.char(pos)

elseif residual ==2 then

local t8 = __ASCII_CODE[string.byte(text,len+1)]

local t9 = __ASCII_CODE[string.byte(text,len+2)]

local num = t8*64 + t9

local pos = math.floor(num/16)

ret[index] = string.char(pos)

end

return table.concat(ret)

end

时间: 2024-11-21 01:20:06

lua实现base64编码解码的相关文章

[C语言]Base64编码解码

Base64编码解码 一,Base64编码原理 Base64编码的字符数组如下所示 : ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 字符串转Base64编码:取3字节的字符串转换为四字节的字符串,依次往后转换.得到Base64编码字符串.具体原理如下: 1,如果需要编码的原串字节数刚好为3的倍数,那么转换规则如下: 以中文字符'严'为例,'严'字的UTF-8编码为:0xE4B8A5 = 11100100  10

Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net

Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net 1. Base64编码,1 1.1. 子模式 urlsafe Or  url unsafe2 1.2. 其他的二进制数据表示法  bin2hex() ,Quoted-printable ,UUencode2 2. Base64常用api2 2.1. ------------解码api2 2.2. decode(String s, OutputStream out)2 2.3. 

Base64编码解码算法

Base64不是什么新奇的算法了,不过如果你没从事过页面开发(或者说动态页面开发,尤其是邮箱服务),你都不怎么了解过,只是听起来很熟悉. 对于黑客来说,Base64与MD5算法有着同样的位置,因为电子邮箱(e-mail)正文就是base64编码的. 那么,我们就一起来深入的探讨一下这个东东吧. 对于一种算法,与其问"它是什么?",不如问"它实现了什么?" Base64实现了:将任意字节转为可读字符的编码. 我们知道,除了页面上的文本,计算机中的数据还有很多是不可见的

OpenSSL 使用 base64 编码/解码(liang19890820)

关于 OpenSSL 的介绍及安装请参见:Windows 下编译 OpenSSL 下面主要介绍有关 OpenSSL 使用 base64 编码/解码. 简述 编码解码 更多参考 编码/解码 #include <openssl/evp.h> #include <openssl/bio.h> #include <openssl/buffer.h> #include <string> #include <iostream> using namespace

java对文件的二进制流base64编码解码

1.java对文件的二进制流base64编码解码 一般保存文件的时候选择的方式是将url存进数据库.今天遇到一个对接传文件流的二进制base64编码,简单记录一下. 依赖于commons-io包和commons-codec包. 编码的方法如下: public static String encodeFile(File file) throws IOException { byte[] readFileToByteArray = FileUtils.readFileToByteArray(file

Android Base64编码解码

服务端图片的信息被转化成字符串,传到android客户端,android端需要把这些信息再解码转化成图片并保存在本地. //编码部分 String string = Base64.encodeToString(str.getBytes(),Base64.DEFAULT); //解码部分string 是服务端发来的信息 byte[] byteIcon= Base64.decode(string,Base64.DEFAULT); for (int i = 0; i < byteIcon.length

Javascript中Base64编码解码的使用实例

Javascript为我们提供了一个简单的方法来实现字符串的Base64编码和解码,分别是window.btoa()函数和window.atob()函数. 例如: 1 2 var encodedStr = window.btoa("Hello world"); //字符串编码 var decodedStr = window.atob(encodedStr); //字符串解码

C# base64 编码 解码

编码: byte[] bytes=Encoding.Default.GetBytes("要转换的字符串"); Convert.ToBase64String(bytes); 解码: //"ztKwrsTj"是"我爱你"的base64编码 byte[] outputb = Convert.FromBase64String("ztKwrsTj");    string orgStr= Encoding.Default.GetStri

Base64编码解码原理

一.编码规则 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码.它将需要编码的数据拆分成字节 数组.以3个字节为一组.按顺序排列24 位数据,再把这24位数据分成4组,即每组6位.再在每组的的最高位前 补两个0凑足一个字节.这样就把一个3字节为一组的数据重新编码成了4个字节.当所要编码的数据的字节数不是 3的整倍数,也就是说在分组时最后一组不够3个字节.这时在最后一组填充1到2个0字节.并在最后编码完成后在 结尾添加1到2个 "=". 例:将对ABC进行BA