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