All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.magician.common.util.ByteUtil Maven / Gradle / Ivy

There is a newer version: 2.0.7
Show newest version
package io.magician.common.util;

/**
 * byte工具类
 */
public class ByteUtil {

    /**
     * 从 byte[] 里面截取数据
     * @param nowBytes 被截取的数据
     * @param startIndex 从哪个坐标开始截取
     * @param endIndex 取多长
     * @return 被截取出来的数据
     * @throws Exception
     */
    public static byte[] subByte(byte[] nowBytes, int startIndex, int endIndex) throws Exception {
        if(startIndex > endIndex){
            throw new Exception("结束坐标不能小于开始坐标");
        }

        if((nowBytes.length - 1) < startIndex){
            throw new Exception("开始坐标不能大于被截取的数据长度");
        }

        if(nowBytes.length < (endIndex - startIndex)){
            throw new Exception("结束坐标距离开始坐标的位置不能大于被截取数据的长度");
        }

        /* 计算要取的长度 */
        int length = endIndex - startIndex;

        /* 开始从nowBytes里面取数据 */
        byte[] bytes = new byte[length];
        int index = 0;
        for(int i = startIndex; i < length; i++){
            if(i > (nowBytes.length - 1)){
                break;
            }
            bytes[index] = nowBytes[i];
            index++;
        }
        return bytes;
    }

    /**
     * 从nowBytes中寻找targetByte的位置
     * @return -1 表示头还没读完,>-1 表示targetByte的位置
     */
    public static int byteIndexOf(byte[] nowBytes, byte[] targetByte){
        int startIndex = 0;
        int endIndex = targetByte.length;

        while (true){
            int index = 0;
            boolean exist = true;

            /* 如果剩余长度已经 小于 targetByte的长度 就不用继续了 */
            if((nowBytes.length - startIndex) < targetByte.length){
                return -1;
            }
            /* 从startIndex开始比较,往后比较到endIndex的位置,如果全都相等就说明找到了targetByte */
            for(int i=startIndex; i targetByte.length - 1){
                    return -1;
                }
                /* 只要有一个不相同就说明不相同,重新设置坐标,再次比较 */
                if(nowBytes[i] != targetByte[index]){
                    startIndex++;
                    endIndex++;
                    if(startIndex > (nowBytes.length-1) || endIndex > nowBytes.length){
                        /* 如果坐标已经超出数据的范围了,说明没找到 */
                        return -1;
                    }
                    exist = false;
                    break;
                }
                index++;
            }
            if(exist){
                /* 如果exist等于true,说明上面的for循环里没有进入过if,也就是说已经找到targetByte了 */
                return startIndex;
            }
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy