Java 16进制报文转换中英文报文(通过字节转换)

最近在搞这个16进制报文,网上找了很多地方,解出来的结果不是乱码就是报错,干脆自己写了。

大概是这样的,16进制的报文大家都知道是什么样子 例如:

3C E4 BA A4 E6 98 93 E6 88 90 E5 8A 9F EF BC 81 3E 20 3C 42 61 6B 31 2F 3E

因为其中包含有中文,所以使用常规的强转的话是不成功的,会出现乱码,头开始一直以为是编码的问题,结果发现并不是,太坑了 。

相较于这种,考虑到这些字符都可以转换成字节形式,通过字节byte这个媒介,可以进行16进制和报文的转换。

这个是单个16进制字符的转换

/**
     * @Author 宇智波波奶茶
     * @param inHex
     * @return byte
     */
    public static byte hexToByte(String inHex){
        return (byte) Integer.parseInt(inHex,16);
    }

如果想转换长串的话,就需要得到byte类型的数组了

    /**
     * @Author 宇智波波奶茶
     * @param inHex
     * @return byte[]
     */
    public static byte[] hexToByteArr(String inHex){
        inHex = inHex.replaceAll(" ","").replaceAll("\n","");
        int hexlen = inHex.length();
        byte[] result;
        if (hexlen % 2 == 1){
            hexlen ++;
            inHex = "0" + inHex;
            result = new byte[(hexlen/2)];
        } else {
            result = new byte[(hexlen/2)];
        }
        int j = 0;
        for (int i = 0; i < hexlen; i+=2) {
            result[j] = hexToByte(inHex.substring(i,i+2));
            j++;
        }
        return result;
    }

最后可以通过得到的byte数组,通过String构造方法,根据原有报文的编码格式,转化为字符串

    public void test(){
        String hexStr = "3C E4 BA A4 E6 98 93 E6 88 90 E5 8A 9F EF BC 81 3E 20 3C 42 61 6B 31 2F 3E";
        byte[] bytes = hexToByteArr(hexStr);
        String s = new String(bytes, StandardCharsets.UTF_8);
        System.out.printf("16进制报文为:%s\n转为报文为:%s",hexStr,s);
    }

接下来是 中英文报文转16进制的方法

/**
     * @Author 宇智波波奶茶
     * @param inHex
     * @return byte[]
     */
    public static String strToHex(String s){
        byte[] bt = s.getBytes();
        StringBuilder s1 = new StringBuilder();
        for (int i = 0; i < bt.length; i++) {
            String tempStr = Integer.toHexString(bt[i]);
            if (tempStr.length() > 2){
                tempStr = tempStr.substring(tempStr.length() - 2);
            }
            if (tempStr.length() < 2){
                tempStr = "0" + tempStr;
            }
            s1.append(tempStr);
        }
        return  s1.toString().toUpperCase();
    }

最后结果打印出来

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇智波波奶茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值