Java 搜索已编码标记的文件

Java 搜索已编码标记的文件,java,file,search,Java,File,Search,我有一个文件,我需要搜索编码的标签,并检索由它们标识的数据。标记的长度为4字节,可以标识长度可变的ascii字符串,也可以标识编码为Little Endian的两字节整数值 标记似乎都位于4字节边界上,并且都在文件开头的前2000字节内。我尝试了各种方法来搜索该文件。唯一有效的方法是使用十进制整数值逐字节比较 在SO上找到了一个解决方案,但并不完全适用于此问题:IndexOfPublist()。 我试过这个测试,但结果是-1 byte[] needle = {68,73,67,77}; byte

我有一个文件,我需要搜索编码的标签,并检索由它们标识的数据。标记的长度为4字节,可以标识长度可变的ascii字符串,也可以标识编码为Little Endian的两字节整数值

标记似乎都位于4字节边界上,并且都在文件开头的前2000字节内。我尝试了各种方法来搜索该文件。唯一有效的方法是使用十进制整数值逐字节比较

在SO上找到了一个解决方案,但并不完全适用于此问题:IndexOfPublist()。 我试过这个测试,但结果是-1

byte[] needle = {68,73,67,77};
byte[] hayStack = {00, 01, 68,73,67,77, 11, 45};
location = Collections.indexOfSubList(Arrays.asList(hayStack), Arrays.asList(needle));

我决不拘泥于此代码,并希望有任何其他想法或解决方案。

通过将
字节
数组转换为
字节
数组,您将获得您想要的结果:

Byte[] needle = { 68, 73, 67, 77 };
Byte[] hayStack = { 00, 01, 68, 73, 67, 77, 11, 45 };
location = Collections.indexOfSubList(Arrays.asList(hayStack),
    Arrays.asList(needle));

// location now equals 2

这是因为
Arrays.asList
byte[]
对象上的操作与您想象的不同。它返回一个
列表
而不是
列表

通过将
字节
数组转换为
字节
数组,您将得到所需的结果:

Byte[] needle = { 68, 73, 67, 77 };
Byte[] hayStack = { 00, 01, 68, 73, 67, 77, 11, 45 };
location = Collections.indexOfSubList(Arrays.asList(hayStack),
    Arrays.asList(needle));

// location now equals 2

这是因为
Arrays.asList
byte[]
对象上的操作与您想象的不同。它返回的是一个
列表
而不是
列表
您的问题有点模糊,您的意思是这样的:

// simplified way of identifying tag by first byte of it,
// make it more complex as needed
byte startOfTag = 65;

// for loop assumes tags start at even 4 byte boundary, if not, modify loop
for(int i = 0; i <= data.length-4 ; i += 4) {
    if (data[i] == startOfTag) {
        myTagHandlerMethod(data[i], data[i+1], data[i+2], data[i+3]);
    }
}


如果您想避免在操作基元类型数组时重新发明控制盘,可以使用。例如,它有一个
indexOf
方法,您可以在这里使用。

您的问题有点模糊,您的意思是这样的:

// simplified way of identifying tag by first byte of it,
// make it more complex as needed
byte startOfTag = 65;

// for loop assumes tags start at even 4 byte boundary, if not, modify loop
for(int i = 0; i <= data.length-4 ; i += 4) {
    if (data[i] == startOfTag) {
        myTagHandlerMethod(data[i], data[i+1], data[i+2], data[i+3]);
    }
}


如果您想避免在操作基元类型数组时重新发明控制盘,可以使用。例如,它有一个
indexOf
方法,您可以在这里使用。

“但是结果是-1”,您希望它是什么?如果
hayStack
数组实际上包含
needle
数组,那么您的示例将提供更多信息。在这种情况下,<代码> -1 也被认为是更有意思的。我已经修正了针“但是结果是-1”,你会期望它是什么?如果<代码> HaseTACK/<代码>数组实际上包含了<代码>针< /C>数组,那么你的例子会更加丰富。在这种情况下,<>代码> -1 也被认为是更有意思的。我已经纠正了“谢谢”。你的例子和邓肯·琼斯的作品。现在我无法从文件中读取字节[]。有什么想法吗?再次感谢。@Mike只需使用一个简单的for循环将byte[]数组直接转换为ArrayList,我认为不需要任何中间byte[]数组。@Mike需要注意的一点是:byte[]或ArrayList占用的内存大约是基元数组byte[]的10倍,所以如果您可以使用基元数组,它的效率会更高。在现代硬件上,几千字节可能并不重要,但对于更大数量的数据来说,这是一个杀手。海德,我要回到灵长类动物。谢谢你的意见迈克,谢谢。你的例子和邓肯·琼斯的作品。现在我无法从文件中读取字节[]。有什么想法吗?再次感谢。@Mike只需使用一个简单的for循环将byte[]数组直接转换为ArrayList,我认为不需要任何中间byte[]数组。@Mike需要注意的一点是:byte[]或ArrayList占用的内存大约是基元数组byte[]的10倍,所以如果您可以使用基元数组,它的效率会更高。在现代硬件上,几千字节可能并不重要,但对于更大数量的数据来说,这是一个杀手。海德,我要回到灵长类动物。谢谢你的意见迈克