Java VCF 格式解析

标签: java vcf 格式 | 发表时间:2012-01-03 16:47 | 作者:
出处:http://www.iteye.com

  Java VCF 格式解析

 

 

 

 

 

 

vcf可以用记事本打开,格式如下:

BEGIN:VCARD
VERSION:2.1
N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E5=BC=A0=E4=B8=89;;
FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E5=BC=A0=E4=B8=89
TEL;VOICE;PREF:1-370-000-0000
PHOTO;ENCODING=BASE64;PNG:iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAIAAABt+uBvAAAA。。。。

END:VCARD

 

 

java code:

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import javax.imageio.ImageIO;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class VCFTest {
	public static void main(String[] args) {
		String name = "张三";
		VCFTest vt =new VCFTest();
		
		try {
			//将字符串转换成utf-8 quoted-printable 格式
			String str = vt.qpEncodeingUTF8(name);
			System.out.println(str);
			//将字符串utf-8 quoted-printable 格式 转换成正常格式
			str = vt.qpDecodingUTF8(str);
			System.out.println(str);
			
			String path ="d:\\aa.png";
			//将图片转换成base64格式字符
			//str = vt.BASE64Encodeing(path);
			//将base64格式字符转换成图片
			//vt.BASE64Decoding(str,"png", path);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 编码 图片 转换为 BASE64 
	 * @param path 图片路径
	 * @return 转换后的字符串
	 * @throws Exception
	 */
	public String BASE64Encodeing(String path) throws Exception {
		BASE64Encoder encoder = new BASE64Encoder();
		File file = new File(path);
		FileInputStream fis = new FileInputStream(file);
		byte[] buffer = new byte[(int) file.length()];
		fis.read(buffer);
		return encoder.encode(buffer);
	}

	/**
	 * 解码 BASE64 保存为图片
	 * @param str 需要解码的字符串
	 * @param imgType 解码图片类型
	 * @param path 解码后图片保存的位置
	 * @return 解码是否完成
	 * @throws Exception
	 */
	public boolean BASE64Decoding(String str, String imgType, String path) throws Exception {
		BASE64Decoder decoder = new BASE64Decoder();
		byte[] ib = decoder.decodeBuffer(str);
		BufferedImage bi = ImageIO.read(new ByteArrayInputStream(ib));
		boolean isFinish = ImageIO.write(bi, imgType, new File(path));
		bi.flush();
		return isFinish;
	}

	/**
	 * 编码 UTF8 quoted-printable 
	 * @param str 需要编码的字符串
	 * @return 编码后的字符串
	 * @throws Exception
	 */
	public String qpEncodeingUTF8(String str) throws Exception {
		if (str != null) {
			char[] encode = str.toCharArray();
			StringBuffer sb = new StringBuffer();
			for (int i = 0; i < encode.length; i++) {
				if ((encode[i] >= '!') && (encode[i] <= '~')
						&& (encode[i] != '=') && (encode[i] != '\n')) {
					sb.append(encode[i]);
				} else if (encode[i] == '=') {
					sb.append("=3D");
				} else if (encode[i] == '\n') {
					sb.append("\n");
				} else {
					StringBuffer sbother = new StringBuffer();
					sbother.append(encode[i]);
					String ss = sbother.toString();
					byte[] buf = null;
					buf = ss.getBytes("utf-8");
					// UTF-8: buf.length == 3
					// GBK: buf.length == 2
					if (buf.length == 3) {
						for (int j = 0; j < buf.length; j++) {
							String s16 = String.valueOf(Integer
									.toHexString(buf[j]));
							char c16_6;
							char c16_7;
							if (s16.charAt(6) >= 97 && s16.charAt(6) <= 122) {
								c16_6 = (char) (s16.charAt(6) - 32);
							} else {
								c16_6 = s16.charAt(6);
							}
							if (s16.charAt(7) >= 97 && s16.charAt(7) <= 122) {
								c16_7 = (char) (s16.charAt(7) - 32);
							} else {
								c16_7 = s16.charAt(7);
							}
							sb.append("=" + c16_6 + c16_7);
						}
					}
				}
			}
			str = sb.toString();
		}
		return str;
	}

	/**
	 * 解码 UTF8 quoted-printable 
	 * @param str 需要解码的字符串
	 * @return 解码后的字符串
	 * @throws Exception
	 */
	public String qpDecodingUTF8(String str) throws Exception {
		if (str != null) {
			StringBuffer sb = new StringBuffer(str);
			for (int i = 0; i < sb.length(); i++) {
				if (sb.charAt(i) == '\n' && sb.charAt(i - 1) == '=') {
					sb.deleteCharAt(i - 1);
				}
			}
			str = sb.toString();
			byte[] bytes = str.getBytes("US-ASCII");
			for (int i = 0; i < bytes.length; i++) {
				byte b = bytes[i];
				if (b != 95) {
					bytes[i] = b;
				} else {
					bytes[i] = 32;
				}
			}
			if (bytes != null) {
				ByteArrayOutputStream buffer = new ByteArrayOutputStream();
				for (int i = 0; i < bytes.length; i++) {
					int b = bytes[i];
					if (b == '=') {
						try {
							int u = Character.digit((char) bytes[++i], 16);
							int l = Character.digit((char) bytes[++i], 16);
							if (u == -1 || l == -1) {
								continue;
							}
							buffer.write((char) ((u << 4) + l));
						} catch (ArrayIndexOutOfBoundsException e) {
							e.printStackTrace();
						}
					} else {
						buffer.write(b);
					}
				}
				str = new String(buffer.toByteArray(), "UTF-8");
			}
		}
		return str;
	}
}

 

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java vcf 格式] 推荐:

Java VCF 格式解析

- - ITeye博客
  Java VCF 格式解析. vcf可以用记事本打开,格式如下:. String name = "张三";. //将字符串转换成utf-8 quoted-printable 格式. //将字符串utf-8 quoted-printable 格式 转换成正常格式. //将图片转换成base64格式字符.

JAVA序列化与反序列化三种格式存取(默认格式、XML格式、JSON格式)

- - CSDN博客推荐文章
java中的序列化(serialization)机制能够将一个实例对象的状态信息写入到一个字节流中,使其可以通过socket进行传输、或者持久化存储到数据库或文件系统中;然后在需要的时候,可以根据字节流中的信息来重构一个相同的对象. 序列化机制在java中有着广泛的应用,EJB、RMI等技术都是以此为基础的.

Java获取图片EXIF格式的元数据

- - Java - 编程语言 - ITeye博客
Java中要取得一张图片的exif(Exchangeable Image File, 可交换图像文件)信息. 比如:拍摄时间,拍摄设备型号,焦距,曝光时间等. 通过开源Jar包metadata-extractor-2.8.1.jar、xmpcore-5.1.2.jar中提供的类就可以获取到以上信息.

Java中的锁(Locks in Java)

- - 并发编程网 - ifeve.com
原文链接 作者:Jakob Jenkov 译者:申章 校对:丁一. 锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复杂. 因为锁(以及其它更高级的线程同步机制)是由synchronized同步块的方式实现的,所以我们还不能完全摆脱synchronized关键字( 译者注:这说的是Java 5之前的情况).

Java PaaS 对决

- 呆瓜 - IBM developerWorks 中国 : 文档库
本文为 Java 开发人员比较了三种主要的 Platform as a Service (PaaS) 产品:Google App Engine for Java、Amazon Elastic Beanstalk 和 CloudBees RUN@Cloud. 它分析了每种服务独特的技术方法、优点以及缺点,而且还讨论了常见的解决方法.

Java浮点数

- d0ngd0ng - 译言-电脑/网络/数码科技
Thomas Wang, 2000年3月. Java浮点数的定义大体上遵守了二进制浮点运算标准(即IEEE 754标准). IEEE 754标准提供了浮点数无穷,负无穷,负零和非数字(Not a number,简称NaN)的定义. 在Java开发方面,这些东西经常被多数程序员混淆. 在本文中,我们将讨论计算这些特殊的浮点数相关的结果.

Qt——转战Java?

- - 博客 - 伯乐在线
编者按:事实上,在跨平台开发方面,Qt仍是最好的工具之一,无可厚非,但Qt目前没有得到任何主流移动操作系统的正式支持. 诺基亚的未来计划,定位非常模糊,这也是令很多第三方开发者感到失望,因此将导致诺基亚屡遭失败的原因. Qt的主要开发者之一Mirko Boehm在博客上强烈讽刺Nokia裁了Qt部门的决定,称其为“绝望之举”,而非“策略变更”.

java 验证码

- - ITeye博客
// 创建字体,字体的大小应该根据图片的高度来定. // 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到. // randomCode用于保存随机产生的验证码,以便用户登录后进行验证. // 随机产生codeCount数字的验证码. // 得到随机产生的验证码数字. // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同.

Java异常

- - CSDN博客推荐文章
“好的程序设计语言能够帮助程序员写出好程序,但是无论哪种语言都避免不了程序员写出坏的程序.                                                                                                                          ----《Java编程思想》.

java面试题

- - Java - 编程语言 - ITeye博客
 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面. 抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节. 抽象包括两个方面,一是过程抽象,二是数据抽象.  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法. 对象的一个新类可以从现有的类中派生,这个过程称为类继承.