如何判斷一個byte[] 數組中是否存在某些連續的數據
1、舉例說明:
例如:我要判斷如下的數組中是否存在0X68, 0X73, 0X5f, 0X62, 0X61, 0X79這些數據,如果存在,則把第一個元素的下標找出來.
byte[] mBaseData = {
0X00, 0X00, 0X00, 0X03, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X00, 0X00, 0X03, 0X00, 0X00, 0X00, 0X04, 0X00, 0X00, 0X00, 0X04, 0X00, 0X00, 0X00, 0X08, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X08, 0X00, 0X00, 0X00, 0X06, 0X00, 0X00, 0X00, 0X06, 0X68, 0X73, 0X5f, 0X62, 0X61, 0X79, 0X00, 0X00, 0X00, 0X00, 0X00, 0X07, 0X00, 0X00, 0X00, 0X20, 0X00, 0X00, 0X00, 0X03, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X00, 0X00, 0X00, 0X08, 0X00, 0X00, 0X00, 0X08, 0X00, 0X00, 0X00, 0X08 };
2、解決方案:
方法一:
首先把0X68, 0X73, 0X5f, 0X62, 0X61, 0X79 數據轉爲數組。byte[] src=new byte[]{ 0X68, 0X73, 0X5f, 0X62, 0X61, 0X79}。然後使用while循環一個字節一個字節進行比對。
public int getIndex() {
byte[] src = new byte[]{0x20, 0x21, 0x30};
byte[] mBaseData = new byte[]{0X68, 0X73, 0X5f, 0X62, 0X61, 0X79};
int i = 0;
while (i < mBaseData.length) {
if (mBaseData[i] == src[0] && mBaseData[i + 1] == src[1] && mBaseData[i + 2] == src[2]) {
return i;
} else {
i++;
}
}
return -1;
}
方法二:
第 1 步: 0X68, 0X73, 0X5f, 0X62, 0X61, 0X79 數據轉爲數組。byte[] src=new byte[]{ 0X68, 0X73, 0X5f, 0X62, 0X61, 0X79}
第 2 步: 把 src
和 mBaseData
數組轉換成 String 字符串。
第 3 步: 利用String.indexOf()找到指定數據的位置。如果要截取一段數據,我們可以用String.substring()截取數據。
注意:必須滿足以下條件:
1、字節在轉換爲String過程中,必須是:一個 byte 字節 對應 一次字符編碼。
2、編碼的方式必須採用 ISO-8859-1字符集,否則:一個 byte 字節轉成一個字符 時,這個字符可能需要多個 byte 字節來保存。這時候會導致數組的長度 與 轉換後的字符串的長度不等。我們再使用利用String.indexOf()
來查找位置就失去了意義了。關於這一點可以看相關的博客:Java中byte[]轉String問題 丟失字節
例如:
byte[] src=new byte[]{ 0X68, 0X73, 0X5f, 0X62, 0X61, 0X79}
String srcString = new String(src, "ISO-8859-1");
String baseString = new String(mBaseData, "ISO-8859-1");
String,indexOf(srcString);