1. 程式人生 > >Java中16進位制與字串之間的相互轉換

Java中16進位制與字串之間的相互轉換

在Oracle中表之間關聯需要有包含有中文的字串轉換為16進位制,在網上找了下,比較纖細點的在原文連結

程式碼樣例:

package com.eastcom.two.oracle.hex;

public class StrWithHexTransform {

	public static void main(String[] args) {

		String str = "hello 我是中國人";
		String str2HexStr = str2HexStr(str);
		System.out.println(str2HexStr);
		String hexStr2Str = hexStr2Str(str2HexStr);
		System.out.println(hexStr2Str);

	}

	/**
	 * 字串轉換成為16進位制(無需Unicode編碼)
	 * 
	 * @param str
	 * @return
	 */
	public static String str2HexStr(String str) {
		char[] chars = "0123456789ABCDEF".toCharArray();
		StringBuilder sb = new StringBuilder("");
		byte[] bs = str.getBytes();
		int bit;
		for (int i = 0; i < bs.length; i++) {
			bit = (bs[i] & 0x0f0) >> 4;
			sb.append(chars[bit]);
			bit = bs[i] & 0x0f;
			sb.append(chars[bit]);
			// sb.append(' ');
		}
		return sb.toString().trim();
	}

	/**
	 * 16進位制直接轉換成為字串(無需Unicode解碼)
	 * 
	 * @param hexStr
	 * @return
	 */
	public static String hexStr2Str(String hexStr) {
		String str = "0123456789ABCDEF";
		char[] hexs = hexStr.toCharArray();
		byte[] bytes = new byte[hexStr.length() / 2];
		int n;
		for (int i = 0; i < bytes.length; i++) {
			n = str.indexOf(hexs[2 * i]) * 16;
			n += str.indexOf(hexs[2 * i + 1]);
			bytes[i] = (byte) (n & 0xff);
		}
		return new String(bytes);
	}

}
68656C6C6F20E68891E698AFE4B8ADE59C8BE4BABA
hello 我是中國人

OK!

打成jar表是其成為Oracle中的函式可以參考連結:

-----------------------------------------------------------------------

編碼格式有多種方式

以下例項是gbk編碼方式

package com.eastcom.two.oracle.hex;

import java.io.UnsupportedEncodingException;

public class StrWithHexTransform {

	public static void main(String[] args) {

		String str = "【IRMS-040-170308-00779】JS/中博學院宿舍樓二期-ONT1061";
		String bytes = "a1be49524d532d3034302d3137303330382d3030373739a1bf4a532fd6d0b2a9d1a7d4bacbdec9e1c2a5b6fec6da2d4f4e5431303631";
		String bytes2 = "a1be49524d532d3034302d3137303630342d3031313035a1bf4a532fd6d0b2a9d1a7d4bacbdec9e1c2a5b6fec6da2d4f4e5431313132";
		// System.out.println(str2HexStr(str, "#"));
		// System.out.println(str2HexStr(str));
		System.out.println(hexStr2Str(bytes));
		System.out.println(hexStr2Str(bytes2));

	}

	public static String str2HexStr(String str, String separator) {
		StringBuffer sb = new StringBuffer();
		try {
			byte[] bytes = str.getBytes("gb2312");
			sb.append(byteToString(bytes[0]));
			for (int i = 1; i < bytes.length; i++) {
				sb.append(separator);
				sb.append(byteToString(bytes[i]));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return sb.toString().trim();
	}

	/**
	 * 中文編碼 轉化為gb2312編碼16進位制
	 * 
	 * @param str
	 * @return
	 */
	public static String str2HexStr(String str) {
		StringBuffer sb = new StringBuffer();
		try {
			byte[] bytes = str.getBytes("gb2312");
			sb.append(byteToString(bytes[0]));
			for (int i = 1; i < bytes.length; i++) {
				sb.append(byteToString(bytes[i]));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return sb.toString().trim();
	}

	/**
	 * gb2312編碼16進位制轉換為中文
	 * 
	 * @param str
	 * @return
	 */
	public static String hexStr2Str(String str) {
		String string = str;
		byte[] bytes = new byte[string.length() / 2];
		for (int i = 0; i < bytes.length; i++) {
			byte high = Byte.parseByte(string.substring(i * 2, i * 2 + 1), 16);
			byte low = Byte.parseByte(string.substring(i * 2 + 1, i * 2 + 2), 16);
			bytes[i] = (byte) (high << 4 | low);
		}

		try {
			return new String(bytes, "gb2312");
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;

	}

	private static String byteToString(byte b) {
		String str = Integer.toHexString(b);
		if (str.length() > 2)
			str = str.substring(str.length() - 2);
		return str;
	}

}