2013-04-10 8 views
0

Я получаю исключение «array out of bounds», когда запускаю следующий код. В основном я отправляю две закодированные строки TLV от клиента к серверу, и сервер декодирует TLV-кодированные значения и печатает их на экране.ArrayOutOfBoundsException при расшифровке сообщения

кода печатать декодирует значение

byte[] from_ca = new byte[65536]; 
int msg = is.read(from_ca, 0, 65536); 
from_ca = Arrays.copyOfRange(from_ca, 0, msg); 
Object[] decodeBytes = TLV.decode(from_ca); 

String ca_id = (String) decodeBytes[0]; 
String cb_id = (String) decodeBytes[1]; 

код в классе TLV для декодирования

public static Object[] decode(byte[] data) throws Exception { 
    int i = 0; 
    List<Object> tlvList = new ArrayList<Object>(); 
    while (i < data.length) { 
     if (data[i] == TLV.ascii) { 
      int length = (256 * data[i + 2]) + data[i + 1]; 
      tlvList.add(new String(Arrays.copyOfRange(data, i + 3, i + 3 + length), "US-ASCII")); 
      i = i + 3 + length; 

     } else if (data[i] == TLV.integer) { 
      int length = (256 * data[i + 2]) + data[i + 1]; 
      tlvList.add(Integer.parseInt(new String(Arrays.copyOfRange(
      data, i + 3, i + 3 + length), "US-ASCII"))); 
      i = i + 3 + length; 

     } else if (data[i] == TLV.binary) { 
      int length = (256 * data[i + 2]) + data[i + 1]; 
      tlvList.add(Arrays.copyOfRange(data, i + 3, i + 3 + length)); 
      i = i + 3 + length; 

     } 
    } // end of loop 
    return tlvList.toArray(new Object[tlvList.size()]); 
} 

Я получаю следующее исключение при запуске программы:

an error has occurred 
java.lang.ArrayIndexOutOfBoundsException: 1 
at ServerConnection.run(Server.java: 131) 
At java.lang.Thread.run(Unknown Source) 

Я был бы признателен любая помощь отлаживает проблему дальше или даже решение, если это возможно.

+5

Какая строка строки 131 Server.java? – craig65535

+0

Пожалуйста, отредактируйте свой код, чтобы сделать его более читабельным. На данный момент ужасно трудно читать. (Почему вы копируете байт-массивы при построении строк, кстати? Просто используйте перегруженный конструктор String, который позволяет вам указать начальный индекс.) –

+0

Кажется, когда вы пытаетесь скопировать диапазон массивов, 'i + 3' или 'i + 3 + length' выходит за пределы диапазона. Добавьте подтверждение для этого, чтобы рассмотреть минимальный вычисленный индекс или длину массива. – devang

ответ

0

Наиболее probaby эта линия вызывает Вас Exception

int length = (256 * data[i + 2]) + data[i + 1]; 

когда счетчик достигает (i)data.length затем data [i+2] и data[i + 1] превысит диапазоны массива.

+0

Я должен добавить, что программа печатает 'String ca_id = (String) decodeBytes [0];' без проблем, это когда я пытаюсь получить доступ к decodeBytes [1]; я получаю исключение. – user1896168

+0

@ user1896168 Я попытался воспроизвести вашу проблему, и все хорошо. Возможно, причиной может стать ваша передача данных или возврат значений из метода. Посмотрите, содержит ли 'decodeBytes.length' 2 adn ваши возвращенные данные. – Smit

+0

Я принимаю ваш ответ, поскольку он единственный, кто может дать что-то конструктивное ... Я все еще не нашел проблему, но я ожидаю, что это что-то не так с массивом, который я возвращаю из функции. – user1896168

0

Вы повторяете до i < data.length, но затем пытаетесь получить доступ к data[i + 1] и data[i + 2].

Вы должны сделать

while (i < data.length - 2) вместо этого.

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