按 DataInputStream int 排序字节数组
Order byte array by the DataInputStream int
我有音频数据包,开头有一个序号,是4个字节。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeInt(sequenceNumber);
我以随机顺序接收数据包,然后将其放入缓冲区,即数组数组。
我想知道按序列号排序数据包的最佳方式是什么。
我像这样检索序列号:
ByteArrayInputStream bos = new ByteArrayInputStream(udpPacketBytes);
DataInputStream ds = new DataInputStream(bos);
int receivedValue = ds.readInt();
有没有办法不用去掉序号就可以按序号对整个字节数组进行排序?
你可以做到
byte[] bytes = new byte[ds.available()];
ds.readFully(bytes);
获取剩余字节。
为了确保数据包是按照原来的顺序排列的,您需要检查序号是否比之前的序号多1。如果不是,则需要按序列号保存数据包并重新排序。更具挑战性的问题是当数据包丢失时你需要再次请求。
你可以使用像
这样的东西
public class OrderManager {
int nextSequence = 0;
final SortedMap<Integer, byte[]> buffered = new TreeMap<>();
final Consumer<byte[]> consumer;
public OrderManager(Consumer<byte[]> consumer) {
this.consumer = consumer;
}
public void accept(int num, byte[] bytes) {
if (num == nextSequence) {
consumer.accept(bytes);
nextSequence++;
while (buffered.firstKey() == nextSequence) {
consumer.accept(buffered.remove(buffered.firstKey()));
nextSequence++;
}
} else {
buffered.put(num, bytes);
}
}
}
由于乱序数据包很少见,但丢失数据包相当普遍,您可以将乱序数据包视为丢失,然后将数据包发送给生产者以再次发送。
我有音频数据包,开头有一个序号,是4个字节。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeInt(sequenceNumber);
我以随机顺序接收数据包,然后将其放入缓冲区,即数组数组。
我想知道按序列号排序数据包的最佳方式是什么。
我像这样检索序列号:
ByteArrayInputStream bos = new ByteArrayInputStream(udpPacketBytes);
DataInputStream ds = new DataInputStream(bos);
int receivedValue = ds.readInt();
有没有办法不用去掉序号就可以按序号对整个字节数组进行排序?
你可以做到
byte[] bytes = new byte[ds.available()];
ds.readFully(bytes);
获取剩余字节。
为了确保数据包是按照原来的顺序排列的,您需要检查序号是否比之前的序号多1。如果不是,则需要按序列号保存数据包并重新排序。更具挑战性的问题是当数据包丢失时你需要再次请求。
你可以使用像
这样的东西public class OrderManager {
int nextSequence = 0;
final SortedMap<Integer, byte[]> buffered = new TreeMap<>();
final Consumer<byte[]> consumer;
public OrderManager(Consumer<byte[]> consumer) {
this.consumer = consumer;
}
public void accept(int num, byte[] bytes) {
if (num == nextSequence) {
consumer.accept(bytes);
nextSequence++;
while (buffered.firstKey() == nextSequence) {
consumer.accept(buffered.remove(buffered.firstKey()));
nextSequence++;
}
} else {
buffered.put(num, bytes);
}
}
}
由于乱序数据包很少见,但丢失数据包相当普遍,您可以将乱序数据包视为丢失,然后将数据包发送给生产者以再次发送。