Java 在哪里可以找到ByteUtils实现来对字节数组执行字符串操作(indexOf、split等)?

Java 在哪里可以找到ByteUtils实现来对字节数组执行字符串操作(indexOf、split等)?,java,Java,我将使用字节数组而不是字符串,所以我需要对它们执行字符串操作。当然,我不能从它们中创建一个字符串,并在操作后返回字节数组。我需要在现场进行操作,如下所示: int x = ByteUtils.indexOf(myByteArray, (byte) 'a'); EDIT1:假设一个字节=>一个字符(没有unicode,这是ASCII)。 EDIT2:我需要一系列字符串操作,而不仅仅是indexOf。要搜索字节数组,您可以使用Knuth-Morris-Pratt模式匹配算法,例如,请参阅 取

我将使用字节数组而不是字符串,所以我需要对它们执行字符串操作。当然,我不能从它们中创建一个字符串,并在操作后返回字节数组。我需要在现场进行操作,如下所示:

   int x = ByteUtils.indexOf(myByteArray, (byte) 'a');
EDIT1:假设一个字节=>一个字符(没有unicode,这是ASCII)。


EDIT2:我需要一系列字符串操作,而不仅仅是indexOf。

要搜索字节数组,您可以使用Knuth-Morris-Pratt模式匹配算法,例如,请参阅

取决于所需的
索引类型(字符或完整字符串)。

对于使用
ArrayUtils
或中的等效项执行的某些其他操作,可能足以满足您的要求?

您将无法执行该类型的操作,因为您正在混合字节和字符。您要么必须采用字符编码(我认为您的问题中采用的是ascii),要么需要使用Java平台的字符编码,这意味着您需要使用一些字符集将其转换为至少一个字符数组

这里的问题是Java中的char是2个字节,您认为可以使用单个字节。无论如何,如果你真的想这样做,而不使用提供的工具,你可能不得不自己编写,因为一般来说,编写开源工具的人会假设完全使用工具包,除非这是一个我怀疑的常见问题

因此,您必须编写自己的版本,下面是一个示例:

public int indexOf( byte[] bytes, String stuff, String encoding ) {
    byte[] pattern = stuff.getBytes(encoding);
    int startIndex = 0, patternIndex = 0;
    for( int i = 0; i < bytes.length && patternIndex < pattern.length; i++ ) {
       if( pattern[patternIndex] == bytes[i] ) {
          if( patternIndex == 0 ) startIndex = i;
          patternIndex++;
       } else {
          patternIndex = 0;
       }
    }
    return patternIndex == pattern.length ? startIndex : -1;
}
public int indexOf(字节[]字节,字符串填充,字符串编码){
byte[]pattern=stuff.getBytes(编码);
int startIndex=0,patternIndex=0;
对于(int i=0;i

您可以尝试以下库:

Arrays.binarySearch????字节数组不能与字符串互换,在Java这样的Unicode世界中肯定不行:多字节字符和区域设置差异会使这种方法完全浪费时间,因此没有标准的实现。对于简单的操作(如示例中的搜索),可以使用标准阵列设施;对于复杂的操作,您不应该在字节[]上执行它们。@SergeyBenner binary search仅在排序数组上工作,而包含通用字符串的字节[]显然不适用。@Viruzzo:“多字节字符和区域设置差异会使这种方法完全浪费时间”。。。如果您使用的是“字符串”,您知道其中包含的“代码”不会超过256个。请记住,并非所有字符串都包含“文本”。人们之所以不辞辛劳地编写Java API,对char[]和byte[]进行快速字符串匹配(参见我的答案,链接到Johann Burkard的高性能模式匹配算法)。Edit1:这是ASCII。一个字节=>一个字符=>故事结束。另外,我说过我不想改变信仰我是手工实现的,但过了一段时间就累了。索引,比较,开始,相等,复制。。。如果能在某个地方完成这个实用程序类,那就太好了,不过我还是想找一堆方法,而不仅仅是indexOf。这只是为了说明如何处理多字节问题。您的问题让人困惑的是提供的示例代码,其中在indexOf操作中传递了一个字符。假设您使用字符或字符串的一部分来进行匹配。这就是为什么限制自己不转换的原因。然而,如果您一直使用byte[]进行一般性工作,那么这就更有意义了。您的意图没有得到很好的解释,以及您为什么要避免转换为字符串。编辑了我的答案。字符串生成垃圾。为了避免这种情况,我将所有内容都视为字节[]。所以我从网络中读取一个字节[],做我需要做的事情,然后作为一个字节[]写入网络。没有垃圾被创造出来。我知道,这很糟糕,但这正是我需要做的。