如何判断一个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);