我想使用Preon用于与用 C 编写的服务器进行通信的项目。该协议(protocol)取决于机器的 native 字节序(假设 JVM 与服务器具有相同的字节序,可以用此 java.nio.ByteOrder.getNative()
来解决)并使用 uint64_t
对于数据长度和 int32_t
对于状态代码(负值表示错误)。
我在 Preon 文档中找不到有关签名的信息。我快速浏览了一下源代码,发现nl.flotsam.preon.buffer.DefaultBitBuffer
使用有符号移位( <<
和 >>
)以及 nl.flotsam.preon.buffer.BitBuffer
中多个方法的 javadoc 注释还表明它使用有符号整数,但 javadoc 注释 nl.flotsam.preon.buffer.BitBuffer
说BitBuffer
使用无符号整数。这让我很困惑。
Preon 默认的整数格式是什么?我如何代表uint64_t
和int32_t
?
最佳答案
对于用@BoundNumber标记的数据,默认为LittleEndian。您可以像这样覆盖它:
@BoundNumber(byteOrder=BigEndian)
...但目前无法选择特定于平台的选项。这是一个限制。您可能需要考虑为此提出问题。 (否则,我会在将来的某个地方。)
我看到它工作的方式是有另一个枚举常量,称为 Platform。
更新:
对于字节顺序,Preon 现在(目前仅在头部可用)有三个选项:BigEndian、LittleEndian 和 Native。 Native 将按照 java.nio.ByteOrder.getNative() 指示的字节顺序进行解析。
因此,现在可以编写如下代码:
@BoundNumber(byteOrder=Native) int value;
…转换为有符号的 32 位整数,字节顺序基于架构。
关于java - Preon 中的有符号和无符号整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3541303/