常见的数组工具类

最近在用emqtt,程序中用到了一些数组的工具类,抽空整理了一下,欢迎补充!!!

1.关于crc16校验

/**
     * CRC16校验(校验完整数组)
     *
     * @param buffer 待校验数组
     * @return 校验结果
     */
    public static byte[] modbusCrc16(byte[] buffer) {
        return modbusCrc16(buffer, 0, buffer.length);
    }

    /**
     * CRC16校验(校验部分数组)
     *
     * @param buffer     待校验数组
     * @param startIndex 开始索引
     * @param length     长度
     * @return 校验结果2字节
     */
    public static byte[] modbusCrc16(byte[] buffer, int startIndex, int length) {
        int crc = 0xFFFF;
        int crcPoly = 0xA001;
        for (int i = 0; i < length; i++) {
            if (buffer[i] < 0) {
                crc ^= Integer.parseInt(Integer.toHexString(buffer[i] + 256), 16);
            } else {
                crc ^= buffer[startIndex + i];
            }
            for (int j = 0; j < 8; j++) {
                int crcBit = (crc & 0x01);
                crc >>= 1;
                if (crcBit == 1) {
                    crc ^= crcPoly;
                }
            }
        }
        byte[] tempData = new byte[2];
        tempData[0] = (byte) (crc & 0xFF);
        tempData[1] = (byte) (crc >> 8);
        return tempData;
    }

2.16进制字节码与字符串的相互转换

/**
     * byte数组转16进制String
     *
     * @param bytes byte数组
     * @return 字符串
     */
    public static String bytesToString(byte[] bytes) {
        StringBuilder sum = new StringBuilder();
        for (Byte aByte : bytes) {
            if (aByte >= 0 && aByte <= 15) {
                String s = Integer.toHexString(aByte);
                sum.append("0").append(s);
            } else if (aByte < 0) {
                String s = Integer.toHexString(aByte + 256);
                sum.append(s);
            } else {
                String s = Integer.toHexString(aByte);
                sum.append(s);
            }
        }
        return sum.toString();
    }
/**
     * byte集合转16进制String
     *
     * @param bytes byte数组
     * @return 字符串
     */
    public static String bytesToString(List<Byte> bytes) {
        StringBuilder sum = new StringBuilder();
        for (Byte aByte : bytes) {
            String s = Integer.toHexString(aByte);
            if (aByte >= 0 && aByte <= 15) {
                sum.append("0").append(s);
            } else if (aByte < 0) {
                s = Integer.toHexString(aByte + 256);
                sum.append(s);
            } else {
                sum.append(s);
            }
        }
        return sum.toString();
    }
/**
     * 16进制字符串转byte[]
     * @param hexString
     * @return
     */
    public static byte[] HexToByte(String hexString){
        int len = hexString.length();
        byte[] b = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            // 两位一组,表示一个字节,把这样表示的16进制字符串,还原成一个字节
            b[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character
                    .digit(hexString.charAt(i + 1), 16));
        }
        return b;
    }

3.bcd码与数字字符串相互转换

/**
     * byte集合转bcd码string
     *
     * @param bytes
     * @return
     */
    public static String bcdToString(List<Byte> bytes) {
        StringBuilder sum = new StringBuilder();
        for (Byte aByte : bytes) {
            String temp = String.valueOf(aByte);
            if (aByte >= 0 && aByte <= 9) {
                sum.append("0").append(temp);
            } else {
                sum.append(temp);
            }
        }
        return sum.toString();
    }

    /**
     * byte数组转bcd码string
     *
     * @param bytes
     * @return
     */
    public static String bcdToString(byte[] bytes) {
        StringBuilder sum = new StringBuilder();
        for (Byte aByte : bytes) {
            String temp = String.valueOf(aByte);
            if (aByte >= 0 && aByte <= 9) {
                sum.append("0").append(temp);
            } else {
                sum.append(temp);
            }
        }
        return sum.toString();
    }


    /**
     * 将数字字符串转换成BCD码的数组
     * @param data 数字字符串
     * @return
     */
    public static byte[] String2BcdArray(String data) {
        List<Byte> list = new ArrayList<>();
        if (data.length() % 2 != 0) {
            data = "0" + data;
        }
        for (int i = 0; i < data.length() / 2; i++) {
            byte temp = (byte) ToBcd(ToInt32(data, i));
            list.add(temp);
        }
        return toArray(list);
    }
    public static int ToInt32(String data, int i) {
        String substring = data.substring(i * 2, i * 2 + 2);
        return Integer.parseInt(substring);
    }
    public static int ToBcd(int a) {
        int ret = 0, shl = 0;
        while (a > 0) {
            ret = ret | (a % 10) << shl;
            a = a / 10;
            shl = shl + 4;
        }
        return ret;
    }

4.其他

/**
     * 获取数字的字节数组
     * @param value
     * @return
     */
    public static byte[] GetBytes(int value) {
        ByteBuffer buffer = ByteBuffer.allocate(4).order(ByteOrder.nativeOrder());
        buffer.putInt(value);
        return buffer.array();
    }


    /**
     * 将字节数组用0补齐至所需长度
     * @param oldArray 原始字节数组
     * @param length 所需长度
     * @return
     */
    public static byte[] PaddedLength(byte[] oldArray, int length) {
        byte[] newArray = new byte[length];
        if (oldArray.length < length) {
            for (int i = 0; i < oldArray.length; i++) {
                newArray[i + newArray.length - oldArray.length] = oldArray[i];
            }
        } else {
            newArray = oldArray;
        }
        return newArray;
    }


    /**
     * byte集合转byte数组
     * @param list
     * @return
     */
    public static byte[] toArray(List<Byte> list) {
        byte[] bytes = new byte[list.size()];
        for (int i = 0; i < list.size(); i++) {
            bytes[i] = list.get(i);
        }
        return bytes;
    }



猜你喜欢

转载自blog.csdn.net/xiangyiran/article/details/80056085