Java ByteBuffer compareTo 无法使用分配,但可以使用 wrap
Java ByteBuffer compareTo not working with allocate but it's ok with wrap
我似乎发现使用 java ByteBuffer
的行为很奇怪。我的目的是填充 ByteBuffer
并使用 compareTo
方法。我 运行 在 OpenJDK 64 位上使用 Ubuntu。代码片段是 scala 工作表,但在 java class 中它的行为相同。
这很好用:
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 的 "features" 中的另一个,有时会让你想打那个想出它并认为这是个好主意的家伙: )
ByteBuffer
具有当前位置的概念,因此当您调用 put
两次时,第二个数组的内容将附加在第一个数组的末尾之后。有趣的是 compareTo
从各自的当前位置 开始比较两个缓冲区 的内容。所以,在你的例子中,两个序列都是空的,它只是 returns 0.
我似乎发现使用 java ByteBuffer
的行为很奇怪。我的目的是填充 ByteBuffer
并使用 compareTo
方法。我 运行 在 OpenJDK 64 位上使用 Ubuntu。代码片段是 scala 工作表,但在 java class 中它的行为相同。
这很好用:
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 的 "features" 中的另一个,有时会让你想打那个想出它并认为这是个好主意的家伙: )
ByteBuffer
具有当前位置的概念,因此当您调用 put
两次时,第二个数组的内容将附加在第一个数组的末尾之后。有趣的是 compareTo
从各自的当前位置 开始比较两个缓冲区 的内容。所以,在你的例子中,两个序列都是空的,它只是 returns 0.