Java 按DataInputStream int对字节数组排序

Java 按DataInputStream int对字节数组排序,java,java-io,datainputstream,bytearrayoutputstream,bytearrayinputstream,Java,Java Io,Datainputstream,Bytearrayoutputstream,Bytearrayinputstream,我有一个音频包,开头有一个序列号,是4个字节 ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeInt(sequenceNumber); 我以随机顺序接收数据包,然后将数据包放入一个缓冲区中,形成一个数组 我想知道按序列号排序的最好方法是什么 我检索序列号,如下所示: ByteArrayInputStream

我有一个音频包,开头有一个序列号,是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);
        }
    }
}
公共类OrderManager{
int nextSequence=0;
最终分类映射缓冲=新树映射();
最终消费者;
公共订单经理(消费者){
这个。消费者=消费者;
}
公共void接受(整数,字节[]字节){
if(num==nextSequence){
consumer.accept(字节);
nextSequence++;
while(buffered.firstKey()==nextSequence){
consumer.accept(buffered.remove(buffered.firstKey());
nextSequence++;
}
}否则{
buffered.put(num,字节);
}
}
}

由于无序数据包很少见,但丢失的数据包却相当常见,因此您可以将无序数据包视为丢失数据包,然后将数据包发送给生产者以再次发送。

我假设您的意思是“整个字节数组,但所述序列号”,因此我尝试对字节数组进行排序,字节数组包含音频和序列号,我想按序列号排序,然后我可以按正确的顺序播放音频这个顺序是什么意思?@user3667111你是什么意思?所以我试图排序一个字节数组,字节数组包含音频和序列号,我想按序列号排序,然后我可以按正确的顺序播放音频写入字节[],然后再次读取它不会改变顺序。哦,对不起,我没有正确解释自己,我故意将字节[]放入缓冲区,然后将其打乱。因为我在一个安装网络上测试,这会导致包丢失。所以我要确保我不会连续丢失很多数据包,所以在客户机上对它们进行排序,然后在服务器上对它们重新排序