如何byte[]
在Java中拆分一个字节序列?类似于的byte[]
版本String#split(regex)
。
让我们看一下这个字节数组:
[11 11 FF FF 22 22 22 FF FF 33 33 33 33]
然后选择分隔符为
[FF FF]
然后拆分将分为以下三个部分:
[11 11]
[22 22 22]
[33 33 33 33]
请注意,由于编码问题,您无法将转换byte[]
为String
,然后将其拆分,然后再转换回。当您对字节数组进行此类转换时,结果byte[]
将有所不同。请参考以下内容:将byte []转换为字符串,然后再转换回byte []
请注意,如果使用编码“ iso8859-1”,则可以可靠地从byte []转换为String并返回,并通过char到字节的一对一映射。
但是,这仍然是一个丑陋的解决方案。
我认为您需要自己动手。
我建议分两个阶段解决它:
这里使用的是朴素的模式查找算法。如果定界符很长,KMP将变得值得(因为它可以节省回溯,但是如果定界符以最后不匹配的顺序嵌入定界符,则不会丢失定界符)。
public static boolean isMatch(byte[] pattern, byte[] input, int pos) {
for(int i=0; i< pattern.length; i++) {
if(pattern[i] != input[pos+i]) {
return false;
}
}
return true;
}
public static List<byte[]> split(byte[] pattern, byte[] input) {
List<byte[]> l = new LinkedList<byte[]>();
int blockStart = 0;
for(int i=0; i<input.length; i++) {
if(isMatch(pattern,input,i)) {
l.add(Arrays.copyOfRange(input, blockStart, i));
blockStart = i+pattern.length;
i = blockStart;
}
}
l.add(Arrays.copyOfRange(input, blockStart, input.length ));
return l;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句