如何在Java中围绕字节序列拆分字节数组?

Ori Popowski:

如何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到字节的一对一映射。

但是,这仍然是一个丑陋的解决方案。

我认为您需要自己动手。

我建议分两个阶段解决它:

  1. 找出如何查找每次出现分隔符的索引。Google为“ Knuth-Morris-Pratt”提供了一种高效的算法-尽管更幼稚的算法对于短定界符将是很好的选择。
  2. 每次找到索引时,请使用Arrays.copyOfRange()获得所需的片段并将其添加到输出列表中。

这里使用的是朴素的模式查找算法。如果定界符很长,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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章