我有一个文件,我需要搜索编码标签,并检索由它们识别的数据。标签长度为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));
我绝不会坚持使用此代码,并且会感谢任何其他想法或解决方案。
答案 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>
。