Байтовый массив - расположение позиции символа - PullRequest
2 голосов
/ 18 февраля 2012

У меня есть байтовый массив в Java.Этот массив содержит символ «%» где-то в нем.Я хочу найти положение этого символа в этом массиве.Есть ли способ найти это?

Спасибо заранее!

[ПРАВИТЬ] Я попробовал приведенный ниже код, и он работал нормально.

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

У меня есть сомнения.Каждый символ занимает ровно один байт в java?

Ответы [ 3 ]

2 голосов
/ 18 февраля 2012

Правильное и более прямое решение для гуавы:

Bytes.indexOf(byteArray, (byte) '%');
1 голос
/ 18 февраля 2012

с помощью Google Guava:

com.google.common.primitives.Bytes.asList(byteArray).indexOf(Byte.valueOf('%'))
0 голосов
/ 22 октября 2018

Я пришел из будущего с некоторыми вещами и лямбда-вещами.Если это просто вопрос поиска байта в байте []:

Ввод:

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

С потоковыми и лямбда-данными:

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("%"));

и т. д...

...