Android串口通信10进制转16进制

来源:互联网 发布:位面小蝴蝶知乎 编辑:程序博客网 时间:2024/06/06 14:18

有大半年没更新了哈,现在要回归了。

情景:

之前由于工作需要,用到串口通信。在用网上谷歌开源的串口通信代码向串口发送指令时,由于机器接收的是16进制的指令。后来发现初始16进制的byte数组经过一系列转换后,变成了10进制的byte数组,当使用OutputStream的write方法向串口发送该数组时,机器没有反应。

后来心中便猜想是不是write(1)和write(0x01)到机器那边是不是不一样的数据。结果后来测试果然是不一样的。于是就需要想办法把10进制的byte数组转换成16进制。

网上查了很多资料,很多博客都是使用Integer.toHexString()来转换,但是这只是转换成16进制字符串显示,实际上还是和原始的byte16进制数组不一样的,即使使用转换后的String.getBytes[]也是一样。

解决方案:

经过查询,系统api里并没有10进制转换成16进制的方法,因此这里自己写出转换的方法。

/**     *  普通字符转换成16进制字符串     * @param str     * @return     */    public static String str2HexStr(String str)    {        byte[] bytes = str.getBytes();        // 如果不是宽类型的可以用Integer        BigInteger bigInteger = new BigInteger(1, bytes);          return bigInteger.toString(16);    }    /** 16进制的字符串转换成16进制字符串数组     * @param src     * @return     */    public static byte[] HexString2Bytes(String src) {        int len = src.length() / 2;        byte[] ret = new byte[len];        byte[] tmp = src.getBytes();        for (int i = 0; i < len; i++) {            ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);        }        return ret;    }public static byte uniteBytes(byte src0, byte src1) {    byte _b0 = Byte.decode("0x" + new String(new byte[]{src0})).byteValue();    _b0 = (byte) (_b0 << 4);    byte _b1 = Byte.decode("0x" + new String(new byte[]{src1})).byteValue();    byte ret = (byte) (_b0 ^ _b1);    return ret;}/** 字节数组转16进制字符串显示*/public String bytes2HexString(byte[] b,int length) {    String r = "";    for (int i = 0; i < length; i++) {        String hex = Integer.toHexString(b[i] & 0xFF);        if (hex.length() == 1) {            hex = "0" + hex;        }        r += hex.toUpperCase();    }    return r;}

使用方法:

1、如果原始是10进制的byte数组,则先调用byte2HexString()方法将其转换成16进制显示的String字符串,然后调用HexString2Bytes()方法得到16进制的byte数组。

2、如果原始是字符串,则调用str2HexStr()方法将其转换成16进制字符串,然后调用HexString2Byte()得到16进制byte数组。

最后,调用OutputStream对象的write()方法将数据输出。