工作中用到了机内码 完全陌生的概念 还好有万能的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就得到了国标码。 */ }