目標
實現一個字節數組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;
}