【问题标题】:Order byte array by the DataInputStream int按 DataInputStream int 排序字节数组
【发布时间】:2016-02-23 13:53:54
【问题描述】:

我的音频包的开头有一个序列号,即 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();

有没有不去掉序号的方法,我可以按所述序号对整个字节数组进行排序?

【问题讨论】:

  • 我假设你的意思是“整个字节数组表示序列号”
  • 所以我试图订购一个字节数组,字节数组包含音频和序列号,我想按序列号排序,然后我可以按正确的顺序播放音频

标签: java java-io datainputstream bytearrayoutputstream bytearrayinputstream


【解决方案1】:

你可以的

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

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

【讨论】:

  • 这个顺序如何?
  • @user3667111 什么意思?
  • 所以我试图订购一个字节数组,字节数组包含音频和序列号,我想按序列号排序,然后我可以按正确的顺序播放音频
  • 写入一个 byte[] 然后再读取它不会改变它的顺序。
  • 对不起,我没有正确解释自己,我故意将 byte[] 放入缓冲区,然后将它们打乱。因为我正在一个会导致丢包的设置网络上进行测试。所以我要确保我不会连续丢失很多数据包,所以在客户端将它们打乱,然后在服务器上重新排序
猜你喜欢
  • 2015-06-26
  • 2023-04-04
  • 1970-01-01
  • 2012-07-14
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多