比较 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;
我的比较总是错误的。调试时,我很确定 currRecord
和 leftRecord
具有正确的值。 ByteBuffer
s 也有正确的值(根据调试器)。这里有什么问题?
【问题讨论】:
您发布的代码可以正常工作(尽管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 中的字节的主要内容,如果未能解决你的问题,请参考以下文章