搜索文件以获取编码标签

时间:2013-03-11 14:44:32

标签: java file search

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

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

在SO上找到一个解决方案,但不完全针对此问题建议:indexOfSubList()。 我尝试了这个测试,但结果是-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));

我绝不会坚持使用此代码,并且会感谢任何其他想法或解决方案。

2 个答案:

答案 0 :(得分:2)

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

// 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]);
    }
}

您从Collections.indexOfSubList获得-1,因为Arrays.asList无效,因为byte[]:它会返回List<byte[]>,而不是List<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));

如果您想在操作基本类型数组时避免重新发明轮子,可以使用Google's Guava libs。例如,它可以使用indexOf方法。

答案 1 :(得分:1)

通过将byte数组转换为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[]个对象上运行。它返回List<byte[]>而不是List<Byte>