字节数组 - 定位字符位置

时间:2012-02-17 20:29:52

标签: java byte

我在java中有一个字节数组。该数组包含'%'符号在它的某个地方。我想在该数组中找到该符号的位置。有没有办法找到这个?

提前致谢!

[编辑] 我尝试了下面的代码,它工作正常。

    byte[] b = {55,37,66};
    String s = new String(b);
    System.out.println(s.indexOf("%"));

我怀疑。每个字符在java中只占用一个字节吗?

3 个答案:

答案 0 :(得分:2)

正确且更直接的番石榴解决方案:

Bytes.indexOf(byteArray, (byte) '%');

答案 1 :(得分:1)

使用Google Guava:

com.google.common.primitives.Bytes.asList(byteArray).indexOf(Byte.valueOf('%'))

答案 2 :(得分:0)

我来自未来,拥有一些流媒体和lambda的东西。 如果只是在byte []中找到一个字节的问题:

输入:

byte[] bytes = {55,37,66}; 
byte findByte = '%';

带有流媒体和lambda内容:

OptionalInt firstMatch = IntStream.range(0, bytes.length).filter(i -> bytes[i] == findByte).findFirst();
int index = firstMatch.isPresent ? firstMatch.getAsInt() : -1;

与以下内容几乎相同:

实际上,我想我还是更喜欢这个。 (例如,将其放在某个实用程序类中)。

int index = -1;
for (int i = 0 ; i < bytes.length ; i++) 
  if (bytes[i] == findByte) 
  {
    index = i;
    break;
  }

编辑

您的问题实际上更多地是关于查找字符而不是查找字节。

您的解决方案可以改进的地方:

String s = new String(bytes); // will not always give the same result

// there is an invisible 2nd argument : i.e. charset
String s = new String(bytes, charset); // default charset depends on your system.

因此,您的程序在不同平台上的行为可能有所不同。 一些字符集每个字符使用1个字节,另一些字符集使用2、3,...或不规则。 因此,字符串的大小可能因平台而异。

第二,某些字节序列根本不能表示为字符串。即字符集没有匹配值的字符。

因此,您如何改进它:

如果您只知道字节数组将始终包含普通的旧ascii值,则可以使用以下方法:

byte[] b = {55,37,66};
String s = new String(b, StandardCharsets.US_ASCII);
System.out.println(s.indexOf("%"));

另一方面,如果您知道您的内容包含UTF-8字符,请使用:

byte[] b = {55,37,66};
String s = new String(b, StandardCharsets.UTF-8);
System.out.println(s.indexOf("%"));

等...