【问题标题】:Determine number of Bytes in ByteBuffer确定 ByteBuffer 中的字节数
【发布时间】:2013-05-28 13:28:26
【问题描述】:

我有一个ByteBuffer,它最多可以容纳 (4 + size) bytes(即一个整数后跟size 个字符)。但是,写入 ByteBuffer 的字符数可能小于 size

所以我想知道,有没有办法确定写入ByteBuffer 的字符数,而不仅仅是它的总大小? limitposition 等似乎不是我所追求的。

感谢您的帮助!

【问题讨论】:

  • hasRemaining 呢?
  • hasRemaining 返回一个布尔值,指示是否有任何剩余,而不是剩余多少字节。

标签: java size byte bytebuffer


【解决方案1】:

写入 ByteBuffer 后,可以使用 position() 方法找到您写入的字节数。

如果您随后flip() 缓冲区,则可以使用limit()remaining() 方法找到缓冲区中的字节数。

如果您随后读取一些缓冲区,则可以使用remaining() 方法找到剩余的字节数。

【讨论】:

  • 谢谢安迪。也许问题是我使用wrapbyte[] 复制到缓冲区?这会影响我对您提到的功能的使用吗?如果是这样,有没有办法可以读取写入byte[] 的实际字节数?感谢您的帮助。
  • @Girl 你无法知道实际写入的字节数,因为ByteBuffer 本质上是“可搜索的”。你的写作模式是什么?你是只使用绝对读/写方法,还是相对读/写方法?
  • @fge 我基本上是在阅读DatagrampPacket。我知道DatagramPacket 中内容的最大大小将是4 + size。但是,int 之后的字符数可能少于size。所以我只是想确定DatagramPacket 中实际有多少个字符。感谢您的帮助。
  • @Giri DatagramPacket.getOffset().getLength(),javadoc好像表明实际接收到的数据长度是.getLength() - .getOffset() + 1;您可以使用.getData() 和此信息将其包装起来,或者还有其他东西吗?
  • @fge 我不确定这是否是您的意思:byte[] buffer = new byte[4 + size]; DatagramPacket request = new DatagramPacket(buffer, 4 + size); receiver_Socket.receive(request); int length = request.getLength() - request.getOffset() + 1; 结果是 length = 20 因为 size 是 15即request.getOffset()等于0。在这个数据包中我故意发送少于size个字符。对不起,这有点乱......
【解决方案2】:
DatagramChannel channel = DatagramChannel.open();
ByteBuffer bb = ByteBuffer.allocate(5+size);
channel.receive(bb);
bb.flip();
// actual length of received packet
int len = bb.remaining();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多