报文接收端接收到的数据 带有C2

我方发送的报文,对方接收到后直接就是十六进制数据,但对方需要的是转为十六进制前的字符串;

错误采用方法:

    /**
     * 将十六进制转为字符串
     * 该方法 解析的报文 设备接收到后会出错 符号前会加C2
     * @param hex
     * @return
     */
    public static String convertHexToString(String hex){

        StringBuilder sb = new StringBuilder();
        StringBuilder temp = new StringBuilder();

        //49204c6f7665204a617661 split into two characters 49, 20, 4c...
        for( int i=0; i<hex.length()-1; i+=2 ){

            //grab the hex in pairs
            String output = hex.substring(i, (i + 2));
            //convert hex to decimal
            int decimal = Integer.parseInt(output, 16);
            //convert the decimal to character
            sb.append((char)decimal);
            temp.append(decimal);
        }

        return sb.toString();
    }

    /**
     * 字符串转十六进制
     * 与convertHexToString方法 互相转换 可以实现编码解码
     * @param str
     * @return
     */
    public static String convertStringToHex(String str){

        char[] chars = str.toCharArray();

        StringBuffer hex = new StringBuffer();
        for(int i = 0; i < chars.length; i++){
            hex.append(Integer.toHexString((int)chars[i]));
        }

        return hex.toString();
    }

调用方法:

session.write(IoBuffer.wrap(test.convertHexToString("01100064000A14000000010000000100010000000100010000000112BA").getBytes()));

结果:当出现特殊符号时,对方接收到转为十六进制后,其特殊符号前有C2标识符;
分析结果:
自测:使用convertHexToString转为字符串,再使用convertStringToHex方法转为十六进制;
推断:在调用session处,由于getBytes方法造成错误;将转字节数组的方法也放入转字符串的方法中;

正确方法:

  /**
     *该方法 为 将十六进制字符串转为 十六进制数组然后转为字符串
     */
    public static byte[] toByteArray(String hexString) {
        if (hexString == null || "".equals(hexString))
            throw new IllegalArgumentException("this hexString must not be empty");

        hexString = hexString.toLowerCase();
        final byte[] byteArray = new byte[hexString.length() / 2];
        int k = 0;
        for (int i = 0; i < byteArray.length; i++) {//因为是16进制,最多只会占用4位,转换成字节需要两个16进制的字符,高位在先
            byte high = (byte) (Character.digit(hexString.charAt(k), 16) & 0xff);
            byte low = (byte) (Character.digit(hexString.charAt(k + 1), 16) & 0xff);
            byteArray[i] = (byte) (high << 4 | low);
            k += 2;
        }
        return byteArray;
    }

调用:

session.write(IoBuffer.wrap(toByteArray("01100064000A14000000010000000100010000000100010000000112BA")));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值