Frage

Der folgende Code ist so konzipiert, dass er ein Byte [] und einige andere Dinge aufnimmt (siehe Code, den er verschenkt).Es baut dann ein Paket mit einer bestimmten Länge auf und gibt dieses zurück.Mein Problem ist, wenn ich eine Datei in das Hauptprogramm einlese, muss der Puffer für das Datagrammpaket die Anzahl der zu sendenden Bytes (wenn weniger als 512) + 4 sein.Dies dient dazu, das letzte Paket einer Leseanforderung eines TFTP-Servers zu verarbeiten.Ich erhalte eine Index-Ausnahme außerhalb der Grenzen in der Zeile "buffer [bufferOffset] = data [dataOffset];".Kann mir jemand helfen zu verstehen, warum das passiert und wie man es am besten umgehen kann?

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;

}
War es hilfreich?

Lösung

Ich sehe nicht, wo Sie jemals einen Blick auf den generakodicetagcode ansehen, ist es möglich, dass data.länge größer ist als sandtebyte?Wenn ja, sollte Ihre Schleife über Sentbytes sein, nicht über Daten.

Grundsätzlich ist Ihre Logik, um die Pufferlänge des Puffers zu entscheiden, scheint aus der Größe der Sentbytes misstrauisch geschieden.

Andere Tipps

Dies ist Ihr Code, der in eine kompakte Form umgestaltet wurde:

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;
}

Jetzt ist es ziemlich offensichtlich, was los ist.Ihr Ausdruck für die Puffergröße hängt nicht direkt davon ab data.length, so kann das Problem in den Werten der liegen Argument zur Methode, so wie sie im Code selbst liegen kann.Du bist der Richter.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top