IndexoutOFBounds - Aiuto necessario
-
13-12-2019 - |
Domanda
Il seguente codice è progettato per prendere un byte [] e molte altre cose (vedere il codice che lo dà via).Quindi costruisce un pacchetto con una certa lunghezza e restituisce questo.Il mio problema è quando ho letto in un file nel programma principale, ho bisogno del buffer per il pacchetto Datagram per essere il numero di byte da sinistra da inviare (se inferiore a 512) + 4. Questo è quello di gestire l'ultimo pacchetto di una richiesta di letturadi un server TFTP.Sto ottenendo un indice fuoriuscita dall'eccezione dei limiti sulla linea "buffer [bufferoffset]= dati [dataoffset];".Qualcuno può aiutarmi a capire perché questo sta accadendo e quale sarebbe il modo migliore intorno ad esso?
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;
}
. Soluzione
Non vedo dove hai mai dato un'occhiata a data.length.
è possibile che i dati.Lunghezza sia maggiore di Sentbyte?Se è così, il tuo loop dovrebbe essere su Sentbytes, non oltre i dati.
Fondamentalmente, la tua logica per decidere la lunghezza del buffer del buffer sembra sospettosamente divorziata dalle dimensioni di Sentbytes.
Altri suggerimenti
Questo è il tuo codice refattore a una forma compatta:
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;
}
.
Ora è abbastanza ovvio cosa sta succedendo.La tua espressione per la dimensione del buffer non dipende direttamente da data.length
, quindi il problema può mentire nei valori degli argomenti al metodo, proprio come può mentire nel codice stesso.Sei il giudice.