netty相关工具类

package com.disruptor.util;

import io.netty.channel.ChannelHandlerContext;

import java.util.concurrent.ConcurrentHashMap;

/**
 * @author bluekingzmm
 * @desc
 * @date 2022年06月20日
 */
public class ChannelhandlerUtils {
    private static ConcurrentHashMap<String, ChannelHandlerContext> concurrentHashMap = new ConcurrentHashMap<>();

    public  static void set(String equipCode, ChannelHandlerContext channelHandlerContext) {
        concurrentHashMap.put(equipCode, channelHandlerContext);
    }

    public static ChannelHandlerContext get(String equipCode) {
        return concurrentHashMap.get(equipCode);
    }
}
package com.disruptor.util;


import org.assertj.core.util.DateUtil;

import java.util.Arrays;
import java.util.List;

/**
 * @desc
 * @auth bluekingzmm
 * @date 2021年07月25日
 */
public class NettyUtil {


    /**
     * 过滤替换netty
     *
     * @param code
     * @return
     */
    public static String filterNettyCode(String code) {
        String newCode = code.replace(" ", "-");
        if (code.equals(newCode)) {
            //未知的空格,只能通过正则替换
            newCode = newCode.replaceAll("\\u00A0+", "-");
        }
//        String newCode=convetCode(code);
        List<String> strings = Arrays.asList(newCode.split("-"));
        StringBuilder stringBuilder = new StringBuilder();
        if (newCode.contains("-")) {
            for (String string : strings) {
                if ("0x7e".equals(string)) {
                    string = "0x7d0x02";
                } else if ("0x7d".equals(string)) {
                    string = "0x7d0x01";
                }
                stringBuilder.append(string);
            }
//            newCode = "0x7e" + stringBuilder.toString() + "0x7e";
        }
        return stringBuilder.toString();
    }


    public static void main(String[] args) {
//        System.out.println(filterNettyCode("0x300x7e0x080x7d0x55"));
//        System.out.println(convetCode("0x300x7e0x080x7d0x55"));
//        String s = "7e56fe012021070274617d0251bb0004001a0100000000000000000000000000617d024c8c617d024ca572a104c30e7e";
//        System.out.println(s);
//        byte[] b = HexString2Bytes(s);
//        String bytes2HexString = Bytes2HexString(b);
//        System.out.println(bytes2HexString);
//        String nettyCode = filterNettyCode(bytes2HexString);
//        System.out.println(nettyCode);
//        String a = "56 01 01 20 21 07 02 74 61 7e 51 bb 00 04 00 00";
//        System.out.println(getCheckXOR(a.replace(" ", "")));
//        System.out.println(getBCC(a.replace(" ", "")));
//        System.out.println(getCheckXOR("5001012021070417618939410026"));
//        String code = "7e56fe012021070446618682b700e400 1a03 072c3f1e01e0f11d000000000061868199618681b592f7f8c2b67e";
//        System.out.println(code);

//        String aa = "7e56fe01202107015261ce93dd0019001a03072c698801e0e449000000000061ce933661ce9371520802c3477e7e56fe01202107015261ce93dd0019001a03072c698801e0e449000000000061ce933661ce9371520802c3477e7e56fe01202107015261ce93dd0019001a03072c698801e0e449000000000061ce933661ce9371520802c3477e7e50fe01202107015261ce93ea001a0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc00000a0000a52061ce92a4000000d300000000000000940000000000000072000000000000003e2a7e7e50fe01202107015261ce93ea001a0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc00000a0000a52061ce92a4000000d300000000000000940000000000000072000000000000003e2a7e7e50fe01202107015261ce93ea001a0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc00000a0000a52061ce92a4000000d300000000000000940000000000000072000000000000003e2a7e7e50fe01202107015261ce93ea001a0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc00000a0000a52061ce92a4000000d300000000000000940000000000000072000000000000003e2a7e7e50fe01202107015261ce93ea001a0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc00000a0000a52061ce92a4000000d300000000000000940000000000000072000000000000003e2a7e7e50fe01202107015261ce93f7001b0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000dd000000000000009400000000000000720000000000000048447e7e50fe01202107015261ce93f7001b0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000dd000000000000009400000000000000720000000000000048447e7e50fe01202107015261ce93f7001b0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000dd000000000000009400000000000000720000000000000048447e7e50fe01202107015261ce93f7001b0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000dd000000000000009400000000000000720000000000000048447e7e50fe01202107015261ce93f7001b0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000dd000000000000009400000000000000720000000000000048447e7e50fe01202107015261ce9403001c0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000e7000000000000009400000000000000720000000000000052907e7e50fe01202107015261ce9403001c0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000e7000000000000009400000000000000720000000000000052907e7e50fe01202107015261ce9403001c0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000e7000000000000009400000000000000720000000000000052907e7e50fe01202107015261ce9403001c0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000e7000000000000009400000000000000720000000000000052907e7e50fe01202107015261ce9403001c0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000e7000000000000009400000000000000720000000000000052907e7e50fe01202107015261ce9410001d0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000f100000000000000940000000000000072000000000000005c9a7e7e50fe01202107015261ce9410001d0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000f100000000000000940000000000000072000000000000005c9a7e7e50fe01202107015261ce9410001d0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000f100000000000000940000000000000072000000000000005c9a7e7e50fe01202107015261ce9410001d0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000f100000000000000940000000000000072000000000000005c9a7e7e50fe01202107015261ce9410001d0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000f100000000000000940000000000000072000000000000005c9a7e7e50fe01202107015261ce941d001e0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000fb000000000000009400000000000000720000000000000066a47e7e50fe01202107015261ce941d001e0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000fb000000000000009400000000000000720000000000000066a47e7e50fe01202107015261ce941d001e0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000fb000000000000009400000000000000720000000000000066a47e7e50fe01202107015261ce941d001e0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000fb000000000000009400000000000000720000000000000066a47e7e50fe01202107015261ce941d001e0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000fb000000000000009400000000000000720000000000000066a47e7e50fe01202107015261ce9429001f0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000020000a52061ce92a4000001050000000000000094000000000000007200000000000000707a7e7e50fe01202107015261ce9429001f0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000020000a52061ce92a4000001050000000000000094000000000000007200000000000000707a7e7e50fe01202107015261ce9429001f0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000020000a52061ce92a4000001050000000000000094000000000000007200000000000000707a7e7e50fe01202107015261ce9429001f0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000020000a52061ce92a4000001050000000000000094000000000000007200000000000000707a7e7e50fe01202107015261ce9429001f0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000020000a52061ce92a4000001050000000000000094000000000000007200000000000000707a7e7e50fe01202107015261ce943500200046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc00001e0000a52061ce92a40000010f000000000000009e000000000000007900000000000000704e7e";
//        System.out.println(aa);
//        String aaa = "7e56fe012021070274617d0251bb0004001a0100000000000000000000000000617d024c8c617d024ca572a104c30e7e";
//        String aaa="7e53fe01202107047061dd34de348d001e02c702c303072c4fe001e0c59500000000000c0081618df9a9618df9ae01e27e";
        String aaa = "7eadfe0120210704626216EC811efa00280001000a0a0a0a0a0a0a0a0a0a0a0a0a0a0a000ae67e";
        System.out.println("replyVerification:" + replyVerification(aaa));
//        System.out.println(StringUtil.numToHex64(Long.parseLong("1641391078")));
        String s1 = StringUtil.hexToTenStr("61e0efc0");
        System.out.println("s1:" + s1);
        System.out.println("oooo:" + replyVerification("7eadfe0120210704626216EC811efa00280001000a0a0a0a0a0a0a0a0a0a0a0a0a0a0a000ae67e"));

    }

    /**
     * 异或校验 返回应答数据
     *
     * @param code
     * @return
     */
    public static String replyVerification(String code) {
        //1.先将msg转成7d02-7e
        code = StringUtil.forwardParseRule(code);
        //2、取消息头数据
        String replyMessage = code.substring(2, 18);
        //3、判断应答表识是否是fe,如果是,需要做应答
        String fe = replyMessage.substring(2, 4);
        String timeStamp = timeStamp();
        String time = StringUtil.numToHex64(Long.parseLong(timeStamp));
        String bodyLength = code.substring(26, 30);
        if ("fe".equals(fe)) {
            //4、将应答表识别改成结果 01,为成功
            replyMessage = replyMessage.replace("fe", "01");
            //5、计算异或校验
            String s = replyMessage + time + code.substring(26, 30).replace("fe", "01");
            ;
            String checkXOR = getCheckXOR(s);
            //6、重新转译
            replyMessage = replyMessage + time + bodyLength + "0000" + checkXOR;
            replyMessage = replyMessage.replace("7e", "7d02");
            return "7e" + replyMessage + "7e";
        }
        return "";
    }

    public static String timeStamp() {
        long time = System.currentTimeMillis();
        String t = String.valueOf(time / 1000L);
        return t;
    }

    /**
     * 校验和 互相异或 计算
     * 传字符串
     * 例如:“AA55040002DA”
     * 结果:23
     */
    public static String getCheckXOR(String s) {
        String regex = "(.{2})";
        String replace = s.replaceAll(regex, "$1 ");
        String[] st = replace.split(" ");
        int[] c = new int[st.length + 1];
        for (int i = 0; i < st.length; i++) {
            int i1 = Integer.parseInt(st[i], 16);
            c[i] = i1;
        }
        char x = 0;
        for (int i = 0; i < c.length; i++)
            x ^= c[i];
        return String.format("%x", (int) x);
    }

    /**
     * 16进制转x0
     *
     * @param code
     * @return
     */
    public static String hexStringCode(String code) {
        byte[] b = HexString2Bytes(code);
        String bytes2HexString = Bytes2HexString(b);
        return bytes2HexString;
    }


    /**
     * @param b byte[]
     * @return String
     */
    public static String Bytes2HexString(byte[] b) {
        String ret = "";
        for (int i = 0; i < b.length; i++) {
            String hex = Integer.toHexString(b[i] & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            ret += " 0x" + hex.toUpperCase();
        }
        return ret;
    }

    /**
     * 将两个ASCII字符合成一个字节; 如:"EF"–> 0xEF
     *
     * @param src0 byte
     * @param src1 byte
     * @return byte
     */
    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;
    }

    /**
     * 将指定字符串src,以每两个字符分割转换为16进制形式 如:"2B44EFD9" –> byte[]{0x2B, 0×44, 0xEF,
     * 0xD9}
     *
     * @param src String
     * @return byte[]
     */
    public static byte[] HexString2Bytes(String src) {
        if (null == src || 0 == src.length()) {
            return null;
        }
        byte[] ret = new byte[src.length() / 2];
        byte[] tmp = src.getBytes();
        for (int i = 0; i < (tmp.length / 2); i++) {
            ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);
        }
        return ret;
    }

    public static short charToHex(char x) { //将单个char转换为Hex
        short result = 0;
        switch (x) {
            case 'a':
                result = 10;
                break;
            case 'b':
                result = 11;
                break;
            case 'c':
                result = 12;
                break;
            case 'd':
                result = 13;
                break;
            case 'e':
                result = 14;
                break;
            case 'f':
                result = 15;
                break;
            case 'A':
                result = 10;
                break;
            case 'B':
                result = 11;
                break;
            case 'C':
                result = 12;
                break;
            case 'D':
                result = 13;
                break;
            case 'E':
                result = 14;
                break;
            case 'F':
                result = 15;
                break;
            default:
                result = (short) Character.getNumericValue(x);
                break;
        }
        return result;
    }
}
package com.disruptor.util;

import org.springframework.util.StringUtils;

import java.math.BigInteger;

public class StringUtil {
    public static final String RULE_7D02 = "7d02";
    public static final String RULE_7D01 = "7d01";
    public static final String RULE_7E = "7e";
    public static final String RULE_7d = "7d";

    public static String forwardParseRule(String message) {
        if (StringUtils.isEmpty(message)) {
            return null;
        }
        // 反转的时候,需要去掉头标识位和尾标识位
        message = message.substring(2,message.length() - 2);
        if (message.contains(RULE_7D02)) {
            message = message.replace(RULE_7D02, RULE_7E);
        }
        if (message.contains(RULE_7D01)) {
            message = message.replace(RULE_7D01, RULE_7d);
        }
        message = RULE_7E + message + RULE_7E;
        return message;
    }



    /**
     * 消息内容转义
     *
     * @return
     */
    public static String msgTransferMean(String message) {
        if (StringUtils.isEmpty(message)) {
            return null;
        }
        int totalLength = message.length();
        // 去除起始标识符和结束标识符
        String messageAfterRemoveStartAndEndTag = message.substring(2, totalLength - 2);

        return messageAfterRemoveStartAndEndTag;
    }

    /**
     * 字符串转换为16进制字符串
     *
     * @param s
     * @return
     */
    public static String stringToHexString(String s) {
        String str = "";
        for (int i = 0; i < s.length(); i++) {
            int ch = (int) s.charAt(i);
            String s4 = Integer.toHexString(ch);
            str = str + s4;
        }
        return str;
    }

    public static void main(String[] args) {
        String msg="877e";

        byte[] bytes = StringUtil.hexStringToBytes(msg);
        String message = StringUtil.bytesToHexString(bytes);
        System.out.println(message);
        System.out.println(StringUtil.hexToTenStr(msg));
//        System.out.println(getTurn("3"));
//
//        System.out.println(codeTransform("1",2));
    }

    /**
     * 16进制字符串转换为字符串
     *
     * @param s
     * @return
     */
    public static String hexStringToString(String s) {
        if (s == null || s.equals("")) {
            return null;
        }
        s = s.replace(" ", "");
        byte[] baKeyword = new byte[s.length() / 2];
        for (int i = 0; i < baKeyword.length; i++) {
            try {
                baKeyword[i] = (byte) (0xff & Integer.parseInt(
                        s.substring(i * 2, i * 2 + 2), 16));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        try {
            s = new String(baKeyword, "gbk");
            new String();
        } catch (Exception e1) {
            e1.printStackTrace();
        }
        return s;
    }


    public static String bytesToHexString(byte[] src) {
        StringBuilder stringBuilder = new StringBuilder("");
        if (src == null || src.length <= 0) {
            return null;
        }
        for (int i = 0; i < src.length; i++) {
            int v = src[i] & 0xFF;
            String hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                stringBuilder.append(0);
            }

            stringBuilder.append(hv);
        }
        return stringBuilder.toString();
    }

    public static String BytesHexString(byte[] b) {
        String ret = "";
        for (int i = 0; i < b.length; i++) {
            String hex = Integer.toHexString(b[i] & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            ret += hex.toUpperCase();
        }
        return ret;
    }

    public static byte[] hexStringToBytes(String hexString) {
        if (hexString == null || hexString.equals("")) {
            return null;
        }
        // toUpperCase将字符串中的所有字符转换为大写
        hexString = hexString.toUpperCase();
        int length = hexString.length() / 2;
        // toCharArray将此字符串转换为一个新的字符数组。
        char[] hexChars = hexString.toCharArray();
        byte[] d = new byte[length];
        for (int i = 0; i < length; i++) {
            int pos = i * 2;
            d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
        }
        return d;
    }

    //charToByte返回在指定字符的第一个发生的字符串中的索引,即返回匹配字符
    private static byte charToByte(char c) {
        return (byte) "0123456789ABCDEF".indexOf(c);
    }


    //设备code转化为16进制不满12位填充0
    public  static  String codeTransform(String str,Integer count) {
        Long l;
        l = Long.valueOf(str);
        String s = Long.toHexString(l);
        int length = s.length();
        if (length < count) {
            for (int j = 0; j < count - length; j++) {
                s = "0" + s;
            }
        }
        return s;
    }

    public static String getDefinedLengthStr(String message, int length) {
        int a = length - message.length();
        StringBuilder stringBuilder = new StringBuilder(message);
        for (int i = 0; i < a; i++) {
            stringBuilder.append("0");
        }
        return stringBuilder.toString();
    }

    public static String hexToTenStr(String hexStr) {

        BigInteger x = new BigInteger(hexStr, 16);
        return x + "";
    }

    public static String hexTenToSixteenStr(String hexStr) {
        String format = String.format("%08X", hexStr);
        return format;
    }
    /**
     * 使用8个字节表示
     * @param b 10进制整型
     * @return 16进制字符串
     */
    public static String numToHex64(long b) {
        return String.format("%08x", b);
    }


    //字符串转16进制不满足条件补足0
    public static String getTurn(String s1) {
        if (StringUtils.isEmpty(s1)) {
            s1 = "0";
        }
        Integer i;
        i = Integer.parseInt(s1);
        String s2 = Integer.toHexString(i);
        int l = s2.length();
        if (l < 2) {
            for (int j = 0; j < 2 - l; j++) {
                s2 = "0" + s2;
            }
        }
        return s2;
    }
    //随机生成n位16进制数
    public static String randomlyGenerated(int n) {
        String str = "";
        for (int i = 0; i < n; i++) {
            char temp = 0;
            int key = (int) (Math.random() * 2);
            switch (key) {
                case 0:
                    temp = (char) (Math.random() * 10 + 48);//产生随机数字
                    break;
                case 1:
                    temp = (char) (Math.random() * 6 + 'a');//产生a-f
                    break;
                default:
                    break;
            }
            str = str + temp;
        }
        return str;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值