目标
实现一个字节数组A包含另一个字节数组B的算法,顺序一致
原理
设置一个命中变量,初始化为0,记录两个数组连续连续命中的字节数量,命中数量等于字节数组B的长度时,返回true,如果循环到最后一个字节或者剩余字节长度小于字节数组B的长度时,命中变量都不等于字节数组B的长度,则返回false
算法
- 1.如果字节数组B长度大于字节数组A的长度,直接返回false
- 2.循环获取字节数组的每个字节值
- 3.命中变量等于字节数组B的长度,返回true
- 4.当前字节值是否等于索引为命中变量值的字节数组B中的字节值,如果是,命中变量自增1,continue到第2步继续下一个字节值的对比,否则继续第5步
- 5.命中变量置0
- 6.判断字节数组A的剩余字节数长度是否大于字节数组B的长度,如果大于则跳转到第2步执行循环体,否则跳出,返回false
实践
/**
* 判断是否一个字节数组按顺序包含另一个字节数组
*
* @param pSrcByteArray
* @param pSubByteArray
* @return
*/
public static boolean isIncludeByteArray(byte[] pSrcByteArray, byte[] pSubByteArray) {
boolean retValue = false;
int lvSrcByteArrayLen = pSrcByteArray.length;
int lvSubByteArrayLen = pSubByteArray.length;
while(true) {
if(lvSrcByteArrayLen < lvSubByteArrayLen) {
break;
}
int lvHitByteNumberValue = 0;
for(int i=0; i<lvSrcByteArrayLen; i++) {
int tvByteValue = pSrcByteArray[i];
if(lvHitByteNumberValue == pSubByteArray.length) {
retValue = true;
break;
}
if(tvByteValue == pSubByteArray[lvHitByteNumberValue]) {
lvHitByteNumberValue++;
continue;
}
lvHitByteNumberValue = 0;
//剩余字节数
int tvRemaindingByteLen = lvSrcByteArrayLen - i - 1;
if(tvRemaindingByteLen < pSubByteArray.length) {
break;
}
}
break;
}
return retValue;
}