2015-04-15 2 views
0

Я пытаюсь получить позицию STX (0x02) из ​​приведенного ниже байтового массива. Если вы видите сообщение, оно имеет 0x2 в нескольких местах, но единственное, что я хочу, это STX. Я прокручивал его назад, используя цикл for. Я должен зацикливаться назад. Я пробовал несколько способов, но мне трудно получить эту позицию. Один из способов, который я пробовал, но не работал, где бы ни находился 0x2, и имеет элементы из 3 или более между ними и ETX (0x3) перед ним, получает эту позицию этого STX. Но я делаю что-то неправильно, потому что я продолжаю получать ошибку, с которой у меня возникают трудности при разрешении. Не могли бы вы помочь?Java Получить позицию значения с помощью arraylist

EDIT: Если есть лучший способ, то моя логика нахождения этой позиции (STX), отличая ее от другого 0x2, пожалуйста, можете ли вы это предоставить.

EDIT: Мне нужно пройти назад, как это требуется инструкциями, данными мне.

EDIT: Вот код:

//Test 3: 
    public String Test3(List<Byte> byteList) { 
     //checking positions of the STX and ETX 
     //looping through the array backwards 
     for (int i = byteList.size() - 1; i >= 0; i--) {     
      if (byteList.get(i) == STX && (i >= 3 && byteList.get(i) == ETX)) { 
       STXpos = i; 
      } 
     }  
     return STXpos; 
    } 
    byte[] validMsgWithRandomData = {0x32,0x32,0x32, //Random data 
    0x02, // STX 
    0x31,0x32,0x10,0x02,0x33, // Data 31 32 02 33 
    0x03, // ETX 
    0x31^0x32^0x02^0x33^0x03,// LRC calculated from the data (with the DLE removed) plus the ETX 
    0x2,0x3,0x00,0x02 //Random data 
}; 
+0

Просьба поделиться текстом кода, которую вы используете, чтобы пройти через массив. – CubeJockey

+0

«Мне нужно петлю назад». -> Почему именно? Что касается основной проблемы ... существуют некоторые стандартные алгоритмы поиска шаблона в тексте, например [KMP] (http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80% 93Pratt_algorithm) и [BM] (http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm) – Turing85

+0

Как могут оба 'byteList.get (i) == STX' быть истинными, а также' byteList. get (i) == ETX', если 'STX == ETX'? вы пропускаете «i-something» в тесте STX? –

ответ

1

Поскольку количество элементов между STX и ETX не является постоянным, я бы искать в обычном порядке и искать ETX после того как я найти STX:

public String Test3(List<Byte> byteList) { 
    // find potential STX 
    for (int i = 0; i < byteList.size(); ++i) { 
     if (byteList.get(i) == STX) { 
      // make sure matching ETX exists 
      for (int j = i + 1; j < byteList.size(); ++j) { 
       if (byteList.get(j) == ETX) { 
        return i; 
       } 
      } 
     } 
    } 
} 

вы также можете сделать это в обратном порядке, если вы действительно хотите:

public String Test3(List<Byte> byteList) { 
    // find potential ETX 
    for (int i = byteList.size() - 1; i > 0; --i) { 
     if (byteList.get(i) == ETX) { 
      // make sure matching STX exists 
      for (int j = i - 1; j > 0; --j) { 
       if (byteList.get(j) == STX) { 
        return j; 
       } 
      } 
     } 
    } 
} 

Кстати, если вы хотите force расстояние между элементами STX и ETX вы можете сделать это, изменив инициализацию j.

+0

Спасибо, это прекрасно. Я могу обойти это сейчас и поэкспериментировать с циклом назад и посмотреть, что я получу. – Kaal

+0

np. почему вы хотели бы отступить назад? –

+0

, потому что я делал другие тесты других массивов байтов сообщений, и в одном из них есть два сообщения (первое сообщение, которое является старым, а другое после него - новым). Самый последний из них с STX является действительным, и это второе сообщение, поэтому обратное движение назад имело смысл найти первую позицию stx, и это отлично сработало для этого. Но это была совершенно другая проблема. – Kaal

2

Моя первая попытка с обратной петлей и сложностью O (n).

EDIT: избавление от кандидата на STX.

EDIT 2: Это решение работает, по крайней мере, для нескольких случаев, включая OP (один из них не был протестирован широко ...).

final int NOTFOUND = -1; 
    final int ETX = 0x03; 
    final int STX = 0x02; 
    int stxpos = NOTFOUND; 
    int etxpos = NOTFOUND; 
    int etxcandidatepos = NOTFOUND; 
    for (int i = validMsgWithRandomData.length - 1; i >=0; --i) 
    { 
     if (ETX == validMsgWithRandomData[i]) 
     { 
      etxcandidatepos = i; 
      if (NOTFOUND == etxpos) 
      { 
       etxpos = i; 
       stxpos = NOTFOUND; 
      } 
     } 
     else if (STX == validMsgWithRandomData[i]) 
     { 
      if (NOTFOUND != etxpos) 
      { 
       stxpos = i; 
       if (NOTFOUND != etxcandidatepos) 
       { 
        etxpos = etxcandidatepos; 
        etxcandidatepos = NOTFOUND; 
       } 
      } 
     } 
    } 
+0

Спасибо, ты работал, делая это назад. – Kaal

Смежные вопросы