论坛首页 Java企业应用论坛

奥巴码 Obama(v1.1开始支持编解码中文等多字节字符)

浏览 7129 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2011-10-15  
lonelybug 写道
我觉得不错,至少对于防止被爬虫下载flash或者之类资源的有帮助。


v1.1开始支持中文等多字节字符了,所以也可以象base64一样用来作为一般的编码数据传输。
0 请登录后投票
   发表时间:2011-10-17  
不错 ,我可以从客户端传orderby 语句到后台,这下不会被看到字段名了
0 请登录后投票
   发表时间:2011-10-17  
/** 
	 * 	编码
	 * */
	public static byte[] encodeBytes(byte[] content){
		
		if(content==null || content.length==0)
			return null;
		
		int len = content.length;
		
		byte[] cArray = new byte[len + (int)Math.ceil(len/6.0d) + 1];
		
		if(BLUFF){
			int s = 0;
			int r = new Random().nextInt(26);
			boolean u = ((r ^ len) & 1) == 1;
			s = u ? 65 : 97;
			cArray[0] = (byte)(r + s);
		}else{
			cArray[0] = DEF_SECRET;
		}
		
		
		byte c = 0;
		int n = 0;
		int mark = 0;
		int pos = 0;
		int segs = 0;
		for(int i=0; i<len; i+=6){
			mark = 1+i+segs;
			for(int k=0; (k<6) && (pos<len); k++){
				c = content[pos];
				n = c ^ cArray[0]; 
				n ^= k;
				cArray[mark] |= ((n>>>6)<<k); 
				
				cArray[mark+k+1] = (byte)base_encode[n & MASK_64];
				pos++;
			}
			segs++;
			cArray[mark] = (byte)base_encode[cArray[mark]];
		}
		
		return cArray;
		
	}

大侠你能不能介绍一下你的这个算法,我怎么看到这个有问题呢?

(byte)base_encode[n & MASK_64];
n值跟mask64与操作这样会降低精度吧,到时候还原的时候怎么还原呢?
0 请登录后投票
   发表时间:2011-10-17   最后修改:2011-10-17
bao231 写道
/** 
	 * 	编码
	 * */
	public static byte[] encodeBytes(byte[] content){
		
		if(content==null || content.length==0)
			return null;
		
		int len = content.length;
		
		byte[] cArray = new byte[len + (int)Math.ceil(len/6.0d) + 1];
		
		if(BLUFF){
			int s = 0;
			int r = new Random().nextInt(26);
			boolean u = ((r ^ len) & 1) == 1;
			s = u ? 65 : 97;
			cArray[0] = (byte)(r + s);
		}else{
			cArray[0] = DEF_SECRET;
		}
		
		
		byte c = 0;
		int n = 0;
		int mark = 0;
		int pos = 0;
		int segs = 0;
		for(int i=0; i<len; i+=6){
			mark = 1+i+segs;
			for(int k=0; (k<6) && (pos<len); k++){
				c = content[pos];
				n = c ^ cArray[0]; 
				n ^= k;
				cArray[mark] |= ((n>>>6)<<k); 
				
				cArray[mark+k+1] = (byte)base_encode[n & MASK_64];
				pos++;
			}
			segs++;
			cArray[mark] = (byte)base_encode[cArray[mark]];
		}
		
		return cArray;
		
	}

大侠你能不能介绍一下你的这个算法,我怎么看到这个有问题呢?

(byte)base_encode[n & MASK_64];
n值跟mask64与操作这样会降低精度吧,到时候还原的时候怎么还原呢?


v1.0只能编解码ASCII字符
n & MASK_64 相当于是求 n / 64的余数,而n是:
c = content[pos];
n = c ^ cArray[0]; 

得来的,c是一个ASCII字符,范围在0~127。 c与扰乱码cArray[0](也是一个ASCII字符)异或的结果仍然是0~127间。
所以n & MASK_64的结果保证是在码表坐标[0-63]间,而n / MASK_64(n>>>6)的结果只能是0或1,所以在编码ASCII字符时我只用了一个bit位记录每个字节mod64的情况。

v1.1版本的encode和decode方法由于要编码多字节字符(byte的可能取值范围就变为-128~127了,所以我用两个bit位来记录每字节mod64的情况)



0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics