java 机内码

工作中用到了机内码  完全陌生的概念  还好有万能的Google    记录一下 

过程  先转成区位码  再进行16进制计算

public class StringToJiNeiMa{

	
 
	public static void main(String[] args) throws Exception {
		String str = "计算机";
		int[] quwei = getQuwei(str);
		/*byte[] bs = str.getBytes("GB2312");
		String s = "";
		for (int i = 0; i < bs.length; i++) {
			int a = Integer.parseInt(bytes2HexString(bs[i]), 16);
			s += (a - 0x80 - 0x20) + "";
		}*/
		String s = "";
		for (int i : quwei) {
			s += i + ",";
		}
		//	System.out.println(s);

		String[] stringArray = s.split(",");

		StringBuffer jineima = new StringBuffer();
		for (String ss : stringArray) {

			String hex1 = Integer.toHexString(Integer.parseInt(ss.substring(0, 2)));
			String NewHex1 = hex1.length() > 1 ? hex1 : "0" + hex1;

			String hex2 = Integer.toHexString(Integer.parseInt(ss.substring(2, 4)));
			String NewHex2 = hex2.length() > 1 ? hex2 : "0" + hex2;

			long x1 = Long.parseLong(NewHex1, 16);
			long x2 = Long.parseLong(NewHex2, 16);

			//System.out.println(x);
			long y = Long.parseLong("A0", 16);

			jineima.append((Long.toHexString(x1 + y).toUpperCase()) + " " + (Long.toHexString(x2 + y).toUpperCase()) + " ");
		}
		System.out.println(jineima);

	}

	public static int[] getQuwei(String str) throws Exception {
		byte[] b = str.getBytes("gb2312");
		int[] quwei = new int[b.length / 2];
		for (int i = 0, k = b.length / 2; i < k; i++) {
			quwei[i] = (((b[2 * i] - 0xA0) & 0xff) * 100) + ((b[2 * i + 1] - 0xA0) & 0xff);
		}
		return quwei;
	}
	/*
	 * 1.机内码与区位码
	机内码高位字节=(区号)H+A0H
	机内码低位字节=(位号)H+A0H
	2.国标码与区位码
	国标码高位字节=(区号)H+20H
	国标码低位字节=(位号)H+20H
	3.区位码用两个10进制数表示,另外两种码用两个十六进制数表示.
	4."德"的区位码为2134,下面举例来看如何转成另外两种码:
	a.机内码
	高位字节=(21)(十进制)+A0H(十六进制)=15H+A0H=B5H
	低位字节=(34)(十进制)+A0H(十六进制)=22H+A0H=C2H
	所以,机内码为B5C2
	b.国标码
	高位字节=(21)(十进制)+20H(十六进制)=15H+20H=35H
	低位字节=(34)(十进制)+20H(十六进制)=22H+20H=42H
	所以,国标码为3542


	国标码=区位码+2020H,是这样计算的。区位码是使用十进制表示的。前两个表示“区”,后两个表示“位”,2838就是位于28区,38位,将28和38分别转换成16进制,就是1C26H
	然后用1C26H+2020H就得到了国标码。
	 */

}

猜你喜欢

转载自miller-cn.iteye.com/blog/2237775