【问题标题】:Java ByteBuffer compareTo not working with allocate but it's ok with wrapJava ByteBuffer compareTo 不能与 allocate 一起使用,但可以使用 wrap
【发布时间】:2015-12-11 12:26:12
【问题描述】:

似乎我在使用 java ByteBuffer 时发现了非常奇怪的行为。我的目的是填写ByteBuffer 并使用compareTo 方法。我正在使用 Ubuntu 在 OpenJDK 64 位上运行。代码 sn-p 是 scala 工作表,但在 java 类中它的行为相同。 这工作正常:

import java.nio.{ByteOrder, ByteBuffer}
import org.apache.commons.codec.binary.Hex

val str1 = "FFFFFFFFFFF000000000000000000000"
val str2 = "FFFFFFFFFFFF00000000000000000000"

val bb1 = ByteBuffer.wrap(Hex.decodeHex(str1.toCharArray))
val bb2 = ByteBuffer.wrap(Hex.decodeHex(str2.toCharArray))
println(
  s"""
     |bb1 hex: ${new String(Hex.encodeHex(bb1.array()))}
     |bb2 hex: ${new String(Hex.encodeHex(bb2.array()))}
     |Comparing: bb1.compareTo(bb2): ${ bb1.compareTo(bb2)}
  """.stripMargin)
bb1 hex: fffffffffff000000000000000000000
bb2 hex: ffffffffffff00000000000000000000
Comparing: bb1.compareTo(bb2): -15

这不起作用(也不知道为什么)

import java.nio.{ByteOrder, ByteBuffer}
import org.apache.commons.codec.binary.Hex

val str1 = "FFFFFFFFFFF000000000000000000000"
val str2 = "FFFFFFFFFFFF00000000000000000000"

val bb1 = ByteBuffer.allocate(16)
val bb2 = ByteBuffer.allocate(16)
bb1.put(Hex.decodeHex(str1.toCharArray))//Do the same like in wrap
bb2.put(Hex.decodeHex(str2.toCharArray))//Do the same like in wrap

println(
  s"""
     |bb1 hex: ${new String(Hex.encodeHex(bb1.array()))}
     |bb2 hex: ${new String(Hex.encodeHex(bb2.array()))}
     |Comparing: bb1.compareTo(bb2): ${ bb1.compareTo(bb2)}
  """.stripMargin)
bb1 hex: fffffffffff000000000000000000000
bb2 hex: ffffffffffff00000000000000000000
Comparing: bb1.compareTo(bb2): 0

【问题讨论】:

    标签: java scala hex bytebuffer


    【解决方案1】:

    啊,这是 java 的另一个“特性”,有时让你想打那个家伙,他想出了这个方法并认为这是个好主意:)

    ByteBuffer 具有当前位置的概念,因此当您调用put 两次时,第二个数组的内容会附加在第一个数组的末尾之后。有趣的是compareTo 比较两个缓冲区的内容从各自的当前位置开始。所以,在你的情况下,两个序列都是空的,它只返回 0。

    【讨论】:

    • 但是这些数组是两个独立的变量,它们在不同的缓冲区上运行。不过,put 方法和compareTo 是正确的。解决方案是将位置设置为 0。bb1.position(0)
    • 不确定我理解你所说的“但是”是什么意思 :) 也许,你对我提到两次调用put 感到困惑......这只是为了说明当前位置的实用性,而不是暗示您在同一个缓冲区上调用它两次。
    猜你喜欢
    • 2019-06-19
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多