java八进制、十进制、十六进制(hex)ASCII码字符串和String互转

笔者在做Android串口开发的时候,与串口设备间的通信经常内容都是16进制的

发送命令的时候需要先把命令转成16进制的ASCII字符串。

接收到设备的反馈时需要把16进制的ASCII字符串转成对应的明文。

比如我们要发送的明文为ABCDEF,需要先转成对应的16进制ASCII码字符串414243444546

比如我们收到的反馈为16进制的ASCII码字符串313233343536,需要转成对应的明文123456

16进制ASCII码和单个字符char的互转

我们先来了解单个字符char和ASCII码的互转

1
2
3
4
5
6
7
8
9
10
11
12
// hex转char
// 先将hex字符串转成int
int i = Integer.parseInt("46", 16);
// hex转char方法一,结果为F
String str1 = new String(new char[]{(char)i});
// hex转char方法二,结果为F
String str2 = new StringBuffer().append((char)i).toString();

// char转hex方法一,结果为46(第二个参数16表16进制)
String hex1 = Integer.toString(c, 16);
// char转hex方法二,结果为46
String hex2 = Integer.toHexString('F');

Click and drag to move

ASCII码hex字符串转String明文

代码很简单,就是每两个字符表示的16进制ASCII码解析成一个明文字符

1
2
3
4
5
6
7
8
9
10
11
12
public static String hex2Str(String hex) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hex.length() - 1; i += 2) {
String h = hex.substring(i, (i + 2));
int decimal = Integer.parseInt(h, 16);
sb.append((char) decimal);
}
return sb.toString();
}

// 输出结果为ABCDEF
System.out.println(hex2Str("414243444546"));

Click and drag to move

String明文转ASCII码hex字符串

代码很简单,就是一个明文字符生成两个字符表示的16进制ASCII码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static String str2Hex(String str) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
// 这里的第二个参数16表示十六进制
sb.append(Integer.toString(c, 16));
// 或用toHexString方法直接转成16进制
// sb.append(Integer.toHexString(c));
}
return sb.toString();
}

// 输出结果为414243444546
System.out.println(str2Hex("ABCDEF"));

Click and drag to move

十进制ASCII码字符串和String明文互转

10进制的转换和16进制的类似,只有细微的差别,直接看代码

10进制ASCII转String

1
2
3
4
5
6
7
8
9
10
11
12
13
public static String dec2Str(String ascii) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < ascii.length() - 1; i += 2) {
String h = ascii.substring(i, (i + 2));
// 这里第二个参数传10表10进制
int decimal = Integer.parseInt(h, 10);
sb.append((char) decimal);
}
return sb.toString();
}

// 结果为ABCDEF
System.out.println(dec2Str("656667686970"));

Click and drag to move

String转10进制ASCII

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static String str2Dec(String str) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
// 第二个参数10表示10进制
sb.append(Integer.toString(c, 10));
// 或者省略第二个参数,默认为10进制
// sb.append(Integer.toString(c));
}
return sb.toString();
}

// 结果为656667686970
System.out.println(str2Dec("ABCDEF"));

Click and drag to move

八进制ASCII码字符串和String明文互转

八进制ASCII码的转换也类似,主要要注意的地方是八进制的ASCII码占三位,而16进制和十进制表示法只占两位

8进制ASCII转String

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static String oct2Str(String ascii) {
StringBuilder sb = new StringBuilder();
// 这里这里循环的步进为3,因为8进制的ASCII码占3位
for (int i = 0; i < ascii.length() - 2; i += 3) {
String h = ascii.substring(i, (i + 3));
// 第二个参数8表8进制
int decimal = Integer.parseInt(h, 8);
sb.append((char) decimal);
}
return sb.toString();
}

// 结果为ABCDEF
System.out.println(oct2Str("101102103104105106"));

Click and drag to move

String转8进制ASCII

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static String str2Oct(String str) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
// 这里的第二个参数8表8进制
sb.append(Integer.toString(c, 8));
// 或者直接用toOctalString方法转8进制
// sb.append(Integer.toOctalString(c));
}
return sb.toString();
}

// 结果为101102103104105106
System.out.println(str2Oct("ABCDEF"));

Click and drag to move