Java中16進位制與字串之間的相互轉換
阿新 • • 發佈:2019-01-07
在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; } }