Вопрос

Ниже приведен код предназначен для того, чтобы взять байт [] и несколько других вещей (см. код, это дает ему).Затем он строит пакет с определенной длиной и возвращает это.Моя проблема заключается в том, что когда я прочитал в файле главной программе, мне нужен буфер для пакета Datagram, чтобы быть количеством байтов, оставленных для отправленных (если меньше 512) + 4. Это для обработки последнего пакета запроса на чтениесервера TFTP.Я получаю индекс исключения оценков на линии «Буфер [Bufferoffset]= данные [DataOffset];».Кто-нибудь может помочь мне понять, почему это происходит и какое было бы лучшим образом вокруг этого?

public DatagramPacket doRRQ(byte[] data, int block, InetAddress address, int port, long fileSize, long sentBytes){

//takes file data and creates a buffer for a DATA packet to be used in a RRQ. This packet 
//is passed to MyFirstTFTPServer.java to be modified and sent to client. This is done 
int bufferOffset = 3;
int dataOffset = -1;
byte[] buffer = null;
long difference = 0;
int i = 512;
byte byteBlock = (byte)block++;//possible issue with block no increment. test.

if (sentBytes + 512 > fileSize){

difference = fileSize - sentBytes;
    difference = difference + 4;
    i = (int)difference;
    buffer = new byte[i];

} else {

    buffer = new byte[516];

}

DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, port);
buffer[0] = 0;
buffer[1] = 3;
buffer[2] = 0;
buffer[3] = byteBlock;
for(byte item:data){

    bufferOffset++;
    dataOffset++;
    buffer[bufferOffset] = data[dataOffset];

    //System.out.println(bufferOffset);

    //System.out.println(dataOffset);

}

return packet;

}
.

Это было полезно?

Решение

Я не вижу, где вы когда-либо смотрите на data.length., возможно, что данные. Длина больше, чем отправлять?Если это так, ваша петля должна быть над отправными, а не над данными.

в основном, ваша логика решать, что длина буфера буфера кажется подозрительно разведенным от размера отправленных.

Другие советы

Это ваш код, ориентированный на компактную форму:

public DatagramPacket doRRQ(byte[] data, int block, InetAddress address,
    int port, long fileSize, long sentBytes)
{
  final byte[] buffer =
    new byte[sentBytes + 512 > fileSize? (int)(fileSize - sentBytes) + 4 : 516];
  final DatagramPacket packet = 
    new DatagramPacket(buffer, buffer.length, address, port);
  buffer[1] = 3;
  buffer[3] = (byte)block;
  for (int i = 0; i < data.length; i++) buffer[i+3] = data[i];
  return packet;
}
.

Теперь это довольно очевидно, что происходит.Ваше выражение для размера буфера не зависят напрямую напрямую на data.length, поэтому проблема может лежать в значениях аргументов к способу, как это может лежать в самом коде.Ты будешь судьей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top