/**
		<p>
		最近遇到一个问题 C/C++/Objective-c中的数据类型 16进制数据到java中进行转换</p><p>
		在java总转换 C 中无符号好办,直接用java中的类型转换就行了如 c中无符号Int32 java中 Long.parseLong("FFFF",16)即可</p><p>
		但是碰到一个有符号的 ,就是C中 int类型负数的情况</p><p>
		这里我的解决方案是可以转过来的,但是有个限制(java、c中的int值都在 -128~127这个
		取值范围 通过&位与操作可以得到这个范围中的正确数据)</p><p>
		java中 -3:fffffffd; -83:ffffffad(int:16进制)</p><p>
		C中 -3:fdff ;-83:adff</p><p>
		发现很郁闷的事情 转换的时候需要异位一下才可以,下面贴上代码来验证处理结果</p>
		*/
		public static void main(String[] args) {
			/*
			 * 正数处理
			 */
			System.out.println(Integer.toHexString(127)); // 转换成16进制为 7f 传到C++那边必须是 7fff才能保持一致
			System.out.println(parseInt("7fff")); // 在java中通过异位 即ff7f转换回来就是 127
	
			/*
			 * 负数处理 
			 * <p>负数十六进制转换也同样可以(但是注意int值必须在-128~127这个取值范围, 因为通过byte范围是-128~127超出的部分处理出来的就是脏数据)</p>
			 */
			System.out.println(Integer.toHexString(-5)); // 16进制为fffffffb
			System.out.println(parseInt("fbff")); // 转换回来就是 -5
	
			/*
			 * 中文16进制直接转换 网上看到的感觉比较不错
			 */
			System.out.println(encode("中文")); // D6D0CEC4十六进制
			System.out.println(decode(encode("中文")));
		}
	
		/**
		 * 有符号转换
		 * 
		 * @param data
		 *            4位大小
		 * @return
		 */
		private static int parseInt(String data) {
			String dd = data.substring(2) + data.substring(0, 2);
			int temp = 0;
			try {
				temp = Integer.valueOf(dd, 16);
			} catch (Exception e) {
				e.printStackTrace();
			}
			return (byte) (temp & 0xFF);
		}
	
		/**
		 * <span style="color:blue">数据异位 与C/C++中16进制数据保持一致</span>
		 * 
		 * @param data
		 * @return
		 */
		private String convertHexString(String data) {
			int sum = data.length();
			switch (sum) {
			case 1:
				return "0" + data + "00";
			case 2:
				return data + "00";
			case 3:
				return data.substring(1) + "0" + data.substring(0, 1);
			case 4:
				return data.substring(2) + data.substring(0, 2);
			case 8:
				return data.substring(6) + data.substring(4, 6);
			default:
				break;
			}
			return null;
		}
		
		/*
		 * 将16进制数字解码成字符串,适用于所有字符(包括中文)
		 */
		public static String decode(String bytes) {
			ByteArrayOutputStream baos = new ByteArrayOutputStream(
					bytes.length() / 2);
			// 将每2位16进制整数组装成一个字节
			for (int i = 0; i < bytes.length(); i += 2)
				baos.write((hexString.indexOf(bytes.charAt(i)) << 4 | hexString
						.indexOf(bytes.charAt(i + 1))));
			return new String(baos.toByteArray());
		}
			
		/*
		 * 16进制数字字符集
		 */
		private static String hexString = "0123456789ABCDEF";
	
		/*
		 * 将字符串编码成16进制数字,适用于所有字符(包括中文)
		 */
		public static String encode(String str) {
			// 根据默认编码获取字节数组
			byte[] bytes = str.getBytes();
			StringBuilder sb = new StringBuilder(bytes.length * 2);
			// 将字节数组中每个字节拆解成2位16进制整数
			for (int i = 0; i < bytes.length; i++) {
				sb.append(hexString.charAt((bytes[i] & 0xf0) >> 4));
				sb.append(hexString.charAt((bytes[i] & 0x0f) >> 0));
			}
			return sb.toString();
		}
	/*	
		下面那个网站找到的 感觉挺不错 
		十进制转成十六进制: 
		Integer.toHexString(int i) 
		十进制转成八进制 
		Integer.toOctalString(int i) 
		十进制转成二进制 
		Integer.toBinaryString(int i) 
		十六进制转成十进制 
		Integer.valueOf("FFFF",16).toString() 
		八进制转成十进制 
		Integer.valueOf("876",8).toString() 
		二进制转十进制 
		Integer.valueOf("0101",2).toString() 
		
		
		有什么方法可以直接将2,8,16进制直接转换为10进制的吗? 
		java.lang.Integer类 
		parseInt(String s, int radix) 
		使用第二个参数指定的基数,将字符串参数解析为有符号的整数。 
		examples from jdk: 
		parseInt("0", 10) returns 0 
		parseInt("473", 10) returns 473 
		parseInt("-0", 10) returns 0 
		parseInt("-FF", 16) returns -255 
		parseInt("1100110", 2) returns 102 
		parseInt("2147483647", 10) returns 2147483647 
		parseInt("-2147483648", 10) returns -2147483648 
		parseInt("2147483648", 10) throws a NumberFormatException 
		parseInt("99", throws a NumberFormatException 
		parseInt("Kona", 10) throws a NumberFormatException 
		parseInt("Kona", 27) returns 411787 
		
		
		进制转换如何写(二,八,十六)不用算法 
		Integer.toBinaryString 
		Integer.toOctalString 
		Integer.toHexString 
		*/