`

Java VCF 格式解析

    博客分类:
  • JAVA
阅读更多

 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
2
分享到:
评论
1 楼 viptmd 2012-05-15  
数字 不能编码 ,但是能解码

相关推荐

    csv.rar_csv_csv java_csv java_java vcf csv_java操作v

    Java中没有内置的VCF解析器,但我们可以利用第三方库,如Jaikoz或VCard4Java。以下是一个简单的VCF解析示例: ```java import net.fortuna.ical4j.model.vcard.VCard; import net.fortuna.ical4j.vcard.Builder; ...

    thaplv:单倍体单倍型VCF的工具

    thaplv :用于单倍体/单倍型VCF的工具用于单倍体/单倍型VCF的工具( thaplv )是用于分析以VCF格式存储的单倍型(或单倍体)数据的软件包(请参阅有关基因组学格式规范的更多信息。此工具包的主要目的包括一套高效且...

    rdf-vcf:RDF.rb阅读器,用于各种调用格式(VCF)文件

    注意:由于基于Java的VCF解析器,目前该项目需要JRuby 9.0(或更高版本)。 我们希望最终替代纯Ruby 。特征为VCF和BCF文件实现RDF.rb阅读器,还支持bgzipped文件。 包括一个称为vcf2rdf的CLI工具,用于将VCF文件...

    把所有手机联系人导出到一个vcf文件中

    VCF(vCard)文件是一种标准格式,用于存储个人的联系信息,如姓名、电话号码、电子邮件地址等。这种格式被广泛支持,使得用户能够轻松地在不同设备之间转移或共享联系人数据。本教程将详细介绍如何将所有手机联系人...

    解析VCard java代码

    本文将深入探讨如何在Java环境中解析VCard 2.0、2.1和3.0版本的文件。 首先,了解VCard的基本结构至关重要。VCard文件由一系列属性和值组成,每个属性代表一种联系人信息,如姓名、电话号码、电子邮件地址等。属性...

    vcfjsons:VCF JSON

    而VCF JSON则是VCF格式的一个JSON(JavaScript Object Notation)版本,它将VCF文件的内容转换为JSON结构,以便于数据解析、存储和传输。 VCF JSON的主要优点在于JSON的易读性和可解析性。JSON是一种轻量级的数据...

    vcfToAlignment:将VCF文件转换为路线

    `vcfToAlignment`是一个Java程序,专门设计用于将这些VCF文件转换成另一种表示形式,通常可能是比对(Alignment)格式,比如SAM或BAM,这些格式更适合进行后续的序列分析和比对操作。 VCF文件的内容主要包括以下几...

    Android 2.1 从SD卡导入联系人 vcf

    在实际开发中,我们还可以使用第三方库如`libvcard-java`简化.vcf文件的解析工作。 总的来说,从SD卡导入.vcf文件在Android 2.1中涉及到文件操作、数据解析、ContentProvider交互以及权限管理等多个方面,是Android...

    ez-vcard:Java的vCard解析器库

    易通卡持续集成: 代码覆盖率: Maven Central: 聊天室: 执照: ez-vcard是用Java编写的vCard库。 它可以读取和写入多种不同格式的vCard。 “ ez”代表“ easy”,因为目标是创建易于使用的库。 | | String str =...

    安卓通讯录联系人打电话归属地相关-把所有手机联系人导出到一个vcf文件中。里面包含android-vcard包.rar

    VCF是一种通用的标准格式,用于存储个人联系人的姓名、电话号码、电子邮件等信息,便于在不同设备之间共享。 首先,我们需要了解Android的Contact Provider,它是Android系统提供的一种内容提供者,用于管理和访问...

    vartovcf:将VarDictVarDictJava的变体转换为VCF v4.2格式

    将VarDict / VarDictJava的变体转换为VCF v4.2格式。 ❯ VarDictJava/build/install/VarDict/bin/VarDict \ -b input.bam \ -G /references/hg38.fa \ -N dna00001 \ -c1 -S2 -E3 -g4 -f0.05 \ --fisher \ ...

    CSV_VCF_Merger

    CSV_VCF_Merger 是一个基于Java开发的实用工具,其主要功能是将CSV(逗号分隔值)文件和VCF(通用联系人格式)文件进行合并。这个工具对于那些需要管理和整合大量联系人信息的用户来说非常有用,比如在处理电话簿...

    基于JAVA WEB的SNPs分析平台的开发.pdf

    文章详细介绍了基于Atlas2新算法的提出和开发,强调了利用JAVA WEB开发的SNPs网站分析平台,能够在线进行SNPs的分析,并获取VCF文件。这不仅节省了传统分析所需的时间和成本,还提供了一种更便捷的分析和数据获取...

    JAVA通讯录

    【JAVA通讯录】是一款基于Java开发的通讯录管理软件,其主要特点是支持VCF和CSV两种格式的数据导入与导出,以及提供了一系列基础的联系人管理功能。VCF(Virtual Card Format)是一种标准的电子名片格式,常用于交换...

    Cardcase-java.rar_名片_名片java

    5. 文件导入导出:考虑到实际需求,程序可能支持导入导出名片数据,如从CSV、VCF(电子名片交换格式)文件导入,或者将数据导出为这些格式,便于与其他设备或应用共享。 6. 错误处理和异常管理:为了确保程序的健壮...

    基于JAVA与SQL电子通讯录带系统设计与实现

    此外,导入和导出功能也很重要,支持CSV或VCF格式的文件可以方便用户在不同设备间同步通讯录数据。 总之,《基于JAVA与SQL电子通讯录系统设计与实现》涵盖了从需求分析、系统设计、数据库建模到程序开发的全过程,...

    excel导出联系人

    8. **数据导入与同步**:在安卓设备上,导入联系人通常通过设置或联系人应用进行,导入的.vcf文件会被系统自动解析并添加到现有的联系人列表。 9. **用户界面设计**:虽然没有详细描述,但这个工具很可能有一个用户...

    vcard4j-1.1.3.zip

    "vcard4j-1.1.3.zip"是一个专门针对VCard格式的Java库,它提供了丰富的功能来读取、分析和操作.VCF(VCard Format)文件。 该库的主要特性包括: 1. **文件解析**:vcard4j能够解析.VCF文件的内容,将其转化为Java...

    mime-dir-j-vcard4j

    《Java解析vCard:深入理解mime-dir-j-vcard4j》 在信息技术领域,数据交换是常见的需求之一,尤其在个人联系信息管理方面。vCard便是一种标准格式,用于存储和共享电子名片。本文将围绕Java解析vCard的库——mime-...

    android联系人导入

    如果需要在应用中实现批量导入联系人,通常会使用VCF(vCard)文件格式,这是一种通用的标准,用于交换电子名片。本教程将详细介绍如何在Android应用中实现联系人的VCF文件导入。 首先,我们需要理解VCF文件的结构...

Global site tag (gtag.js) - Google Analytics