由DataInputStream int命令字节数组

时间:2016-02-23 13:53:54

标签: java java-io datainputstream bytearrayoutputstream 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();

有没有一种方法可以不删除序列号,我可以通过所述序列号对整个字节数组进行排序?

1 个答案:

答案 0 :(得分:0)

你可以做到

byte[] bytes = new byte[ds.available()];
ds.readFully(bytes);

获取剩余的字节。

为确保数据包按原始顺序排列,您需要检查序列号是否比前一个更多。如果没有,则需要按序列号保存数据包并重新排序。更具挑战性的问题是当数据包被丢弃时你需要再次请求。

您可以使用类似

的内容
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);
        }
    }
}

由于无序数据包很少见,但丢失的数据包相当普遍,您可以将无序数据包视为已丢失,并将数据包发送给生产者再次发送。