`
googya
  • 浏览: 140530 次
  • 性别: Icon_minigender_1
  • 来自: 汉川
社区版块
存档分类
最新评论

base64编码

阅读更多
        受有道难题中许多答复者的启发,我决定对base64编码也研究一下,因为看起来这个问题在Ruby下是相当的easy。这种做法的问题在于:诸如汉字这样的字符不能还原。。代码如下:
BASE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
def enBASE64(s)
	s.unpack("B*")[0].scan(/\d{1,6}/).map!{|x|
		if x.size==6
			BASE[("0"*2+x).to_i(2)].chr
		elsif		
	  	m=BASE[("0"*2+x.ljust(6,"0")).to_i(2)].chr + ("="*((x.size)%3))#这里主要是填充'='
	  	m
		end
	}.join
end

p enBASE64("if not this is love")

def deBASE64(s)
	i=s.count('=')
	s.tr!('=','')		
	t=s.split(//)
	t.map!{|x|
		g="%08b" %BASE.index(x)
		if i==0 || x!=t.last		
			g[2,6]
		else 		
			i==1?g[2,4]:g[2,2]	#根据填充符号(=)的数量,提取相应的长度	
  	end
  }
   t.join.scan(/\d{8}/).map{|x|x.to_i(2).chr}.join	
end
 p deBASE64("aWYgbm90IHRoaXMgaXMgbG92ZQ==")

是不是很简单,其实用
    def encode64(bin)
    [bin].pack("m")
  end


也可以很简单的实现,同样的,解密也很简单。但是其中隐藏了许多的细节,我们并不清楚,对于我们掌握base64编码的原理并没有帮助。自己写一个的话,可以了解其中的奥秘。


主要参考资料:
http://en.wikipedia.org/wiki/Base64
矛与盾的较量(4)——奇妙的Base64编码
http://tools.ietf.org/html/rfc3548#section-3

分享到:
评论
2 楼 huochai2009 2010-06-14  
顶~~学习了,研究一下
1 楼 huangyuanmu 2010-06-11  
佩服楼主的钻研精神!

相关推荐

Global site tag (gtag.js) - Google Analytics