java版base64编码解码类

较早的java版本没有直接提供base64编码处理的类,都是通过其他类库的附加功能实现。而对于android平台,又有自己的base64支持类,导致代码影响跨平台。所以就自己写了个base64编码处理的类,这样就可以同一套代码运行在android平台和se平台了。
代码如下:

package com.hoverlees.utils;

/**
 * @author hoverlees http://www.hoverlees.com
 * RFC 4648
 */
public class Base64 {
	private static char[] base64Table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();
	private static byte[] base64TableMap=createTableMap();
	private static byte[] createTableMap() {
		byte[] table=new byte[256];
		for(int i=0;i<256;i++) table[i]=-1;
		for(int i=0;i<base64Table.length;i++){
			table[base64Table[i]]=(byte)i;
		}
		return table;
	}
	/**
	 * Base64编码,将字节数组转换成base64字符串
	 * @param data 字节数据
	 * @return base64编码的字符串
	 */
	public static String encode(byte[] data){
		StringBuffer s=new StringBuffer();
		int state=0;
		int pos=0;
		for(int i=0;i<data.length;i++){
			switch(pos){
			case 0:
				state=(data[i]&0xFC)>>2;
				s.append(base64Table[state]);
				state=(data[i]&0x3)<<4;
				pos=1;
				break;
			case 1:
				state|=((data[i]&0xF0)>>4);
				s.append(base64Table[state]);
				state=(data[i]&0xF)<<2;
				pos=2;
				break;
			case 2:
				state|=((data[i]&0xC0)>>6);
				s.append(base64Table[state]);
				state=data[i]&0x3F;
				s.append(base64Table[state]);
				pos=0;
				break;
			}
		}
		if(pos==1){
			s.append(base64Table[state]);
			s.append("==");
		}
		else if(pos==2){
			s.append(base64Table[state]);
			s.append("=");
		}
		return s.toString();
	}
	/**
	 * Base64解码,将base64字符串转换成字节数组
	 * @param data base64的字符串
	 * @return 解码后的字节数组
	 */
    public static byte[] decode(String data){
        byte[] bytes=data.getBytes();
        int n=0;
        int pos=0;
        byte cchar,t;
        for(int i=0;i<bytes.length;i++){
            cchar=bytes[i];
            t=base64TableMap[cchar];
            if(cchar=='=') break;
            switch(pos){
            case 0:
                bytes[n]=(byte)(t<<2);
                pos=1;
                break;
            case 1:
                bytes[n]=(byte)(bytes[n]|((t&0x30)>>4));
                n++;
                bytes[n]=(byte)((t&0xf)<<4);
                pos=2;
                break;
            case 2:
                bytes[n]=(byte)(bytes[n]|((t&0x3c)>>2));
                n++;
                bytes[n]=(byte)((t&0x3)<<6);
                pos=3;
                break;
            case 3:
                bytes[n]=(byte)(bytes[n]|t);
                n++;
                pos=0;
                break;
            }
        }
        byte[] r=new byte[n];
        for(int i=0;i<n;i++) r[i]=bytes[i];
        return r;
    }
}

C语言梆定ActiveX事件

我的博客里写的关于C语言访问COM的一些文章帮助了一些朋友,感到非常高兴。最近有几个朋友发邮件问过我C梆定ActiveX事件的方式,解答后感觉好像也有段时间没有写文章了,所以就详细地来写一篇关于C梆定和监听ActiveX事件的文章。

对C访问COM不是很了解的朋友,可以看我博客里的这些文章:

C语言使用ActiveX控件

C语言访问Windows COM组件函数

本文链接: http://www.hoverlees.com/blog/?p=1793

Continue reading “C语言梆定ActiveX事件”

RTL8019as的网络接口选型

最近打算做新的网络控制板,总结了以前做的RTL8019as网络板子,觉得常用的RTL8019as+20F001N+RJ45比较占用空间,所以就尝试去寻找集成网络变压滤波的RJ45接口。而RTL8019as我还有很多库存,所以它是必用芯片。

以前用过HanRun的HR911105A,知道这是一种集成的接口,但不知道它能否用于RTL8019as。所以就下了HanRun的文档来看,从文档中可以看出它的结构:

果然是集成了网络变压器的,同时它还集成了led,很不错。为了确保它能否支持rtl8019as,我再看了20F001N的文档,它的电路图确是如下结构:

Continue reading “RTL8019as的网络接口选型”

Ejecta

最近发现一个类似于cocos 2D的游戏引擎,Ejecta,它是一个使用JavascriptCore加上OpenGL和OpenAL实现HTML5标准的canvas和audio元素的游戏引擎,可以让HTML5游戏高速地跑在手机平台上,目前有支持ios和andoroid和windows平台的版本。

该引擎只支持HTML5的canvas和audio,使得系统变得小巧,对canvas的支持比较丰富,同时支持2D和WebGL的API。

Ejecta使用MIT Open Source License,这就意味着使用授权比较宽松,几乎可以做任何使用。

官方地地址

http://impactjs.com/ejecta

github地址

https://github.com/phoboslab/Ejecta

https://github.com/yoyeung/Ejecta-android

https://github.com/Wizcorp/Ejecta-X

DS1302使用心得

第一次使用时间芯片,选的DS1302,原因是在一个电脑主板上看到的,纽扣电池和圆柱晶振(32768)连接的芯片就是这个,估计它就是时间芯片了,网上一搜,果然是它,就决定用它了。32K的晶振在以前的电子表上也很常用,所以很容易想到它连接的芯片可能是时间芯片。

驱动编写也挺顺利,毕竟总线通信时序简单。只是在调试时遇到CPU经常拿到的秒数为85的情况,通过延长CLK切换时间可以有点效果,但效果都不明显,最后觉得可能是IO总线变化太慢导致,从而给IO总线加了一个10K的上拉电阻,果然效果很好,立马解决了时间读到85的问题。

另外值得一提的是DS1302手册中提到秒的字节最高位为芯片工作开关,当最高位为1时,芯片不工作,最高位为0时,芯片开始计时。一开始通电时,读到的秒数最高为1,这时需要将最高位设置到0,DS1302就会开始计时了。

DS1302可以用纽扣电池,保证在断电时仍然计时。

PHP的Ajax跨域转发程序

Ajax有一个安全特性就是跨域访问的限制问题,虽然有很多解决的方法,但都没有使用代理的方式简单。

后来发现一个更简单的,就是给chrome浏览器添加 –allow-file-access-from-files –disable-web-security 启动参数,即可实现关闭安全检查的功能。

它的这个特性过份到访问同一个域下的不同端由都做了限制。有时候做测试开发很不方便。所以我就自己写了一个php的代理程序,由php接收ajax请求并转发到其他域的服务器,并将结果返回。

proxy.php代码如下:

<?php
error_reporting(0);

$destURL="http://otherdomain.com/to/path/script.jsp";

$queryString=$_SERVER['QUERY_STRING'];
if($_SERVER['REQUEST_METHOD']=='GET'){
    $url=$destURL.$queryString;
    echo file_get_contents($url);
}
else{
    $url=$destURL.$queryString;
    $context = array();
    $context['http'] = array(
        'method' => 'POST',
        'header'  => 'Content-type: application/x-www-form-urlencoded',
        'content' => http_build_query($_POST)
    );
    echo file_get_contents($url, false, stream_context_create($context));
}
?>

Continue reading “PHP的Ajax跨域转发程序”

nodejs的纯js版websocket服务器程序

nodejs使得做客户端的人也可以做服务器开发,比较可惜的是目前HTML5客户端支持的WebSocket协议nodejs自身不支持。不过也有很多完善的模块提供使用。

我写这个模块的目的只是为了体验下nodejs的服务器开发而已,打算自己以后写得玩的就用这个算了。其中websocket.js是Websocket服务器模块,server.js是测试代码,跟以前写的一样,模块不支持大于65535的数据包发送和接收。

首先是server.js,用法跟客户端类似:

//引入模块
var server=require("./websocket.js");
//监听"/"请求,可以加入多个监听。
server.addListener("/",function(ws){
	ws.onmessage=function(packet){
		ws.send(new Buffer("Hello World!"));
	}
	ws.onclose=function(){
		console.log("session disconnect");
	}
});
server.keepAlive=3000000;
server.timeout=0;
//开启服务器
server.start("127.0.0.1",8766);

Continue reading “nodejs的纯js版websocket服务器程序”