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

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

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

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

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

 

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

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

// 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');

ASCII码hex字符串转String明文

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

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"));

String明文转ASCII码hex字符串

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

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"));

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

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

10进制ASCII转String

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"));

String转10进制ASCII

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"));

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

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

8进制ASCII转String

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"));

String转8进制ASCII

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"));

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐