以下代码旨在获取byte []和其他几个东西(请参阅它给出的代码)。然后它构建一个具有一定长度的数据包并返回它。我的问题是当我在一个文件中读到主程序时,我需要数据报包的缓冲区是剩余发送的字节数(如果小于512)+ 4.这是为了处理读请求的最后一个数据包TFTP服务器。我在“buffer [bufferOffset] = data [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;
}
答案 0 :(得分:2)
我看不到你在哪里看data.length.
data.length是否可能大于sentBytes?如果是这样,你的循环应该超过sentBytes,而不是数据。
基本上,你决定缓冲区缓冲区长度的逻辑似乎与sentBytes的大小背道而驰。
答案 1 :(得分:1)
这是您重构为紧凑形式的代码:
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
,因此问题可能在于方法的参数的值,就像它可能位于代码本身一样。你是法官。