比较 ByteBuffer 中的字节

Posted

技术标签:

【中文标题】比较 ByteBuffer 中的字节【英文标题】:Comparing bytes in a ByteBuffer 【发布时间】:2011-11-01 22:01:14 【问题描述】:

我在 Java 中有一个大小为 4 的 byte 数组,我试图将其前两个字节放入 ByteBuffer

这是我的做法:

byte[] array = new byte[4];
ByteBuffer buff = ByteBuffer.allocate(2);
buff.put(array, 0, 2);

我的代码有什么问题?

编辑:

byte[] currRecord = new byte[4];
byte[] leftRecord = new byte[4];
// Code that populates the records
ByteBuffer currKey = ByteBuffer.allocate(2);
currKey = currKey.put(currRecord, 0, 2);
ByteBuffer leftKey = ByteBuffer.allocate(2);
leftKey = leftKey.put(leftRecord, 0, 2);

然后我尝试比较ByteBuffers,如下所示:

if (currKey.compareTo(leftKey) >= 0)
    return;

我的比较总是错误的。调试时,我很确定 currRecordleftRecord 具有正确的值。 ByteBuffers 也有正确的值(根据调试器)。这里有什么问题?

【问题讨论】:

您发布的代码可以正常工作(尽管array 中没有什么有趣的地方)。发布您的真实代码。 问:“我的代码有什么问题?” A:“错了!?!”告诉我们正在发生的事情以及您期望发生的事情。代码很简单,如果您坐下来尝试向我们解释问题所在,那么您很可能会找到解决方案(并且您可能不需要发布 SO 问题)。 回显链接 - 是什么让您认为您的代码有问题?它在做什么(或不做什么)与您的预期不同? 好吧,我认为这是问题所在,而您刚刚指出它是正确的!查看编辑。 【参考方案1】:

compareTo 比较缓冲区的剩余字节数。因此,您必须在比较之前先flip() 两个缓冲区。

如果没有flip,您将比较每个缓冲区中的字节[2..3]。因为您没有写入这些字节,所以它们都将为零。使用flip,您将比较包含您从数组写入的数据的字节[0..1]。

【讨论】:

【参考方案2】:

您还没有说您要寻找什么结果。你发布的代码对我来说很好用

byte[] currRecord = new byte[4];
byte[] leftRecord = new byte[4];
// Code that populates the records
ByteBuffer currKey = ByteBuffer.allocate(2);
currKey = currKey.put(currRecord, 0, 2);
ByteBuffer leftKey = ByteBuffer.allocate(2);
leftKey = leftKey.put(leftRecord, 0, 2);

if (currKey.compareTo(leftKey) == 0)
    System.out.println("equal");
else
    System.out.println("not equal");

//输出“相等”

您是否期望这相等?如果是这样,我不明白为什么。您的代码中没有任何内容会明确说明这些不相等

注意 - 在两个缓冲区上调用 flip() 仍会产生“相等”。

【讨论】:

不,它没有。调用 flip() 修复它。 @Nayefc 大声笑.. 使用您提供的代码,如果您在两个字节缓冲区上调用 flip() 或不调用,则没有区别。我测试了好几次。 我也是 - 它确实有效:) 使用调试器并跟踪堆中的对象。

以上是关于比较 ByteBuffer 中的字节的主要内容,如果未能解决你的问题,请参考以下文章

Netty实战五之ByteBuf

Netty Bytebuf解析

io.netty.ByteBuf writeBytes(java.nio.ByteBuffer src) API说明

比较 ByteBuffer 中的字节

ByteBuffer类学习

JDK又在写Bug!告诉你为何Java NIO的ByteBuffer这么垃圾!