【问题标题】:Platform differences reading byte values using JNA使用 JNA 读取字节值的平台差异
【发布时间】:2017-01-02 22:21:37
【问题描述】:

我创建了一个 JavaFX 应用程序来从 FTDI 外围设备检索数据。我使用 JNAerator 生成 API,一切都在我的开发机器 (OS X) 上运行良好。但是,当在同事的盒子 (Windows) 上进行测试时,BirdJ Pointer.getBytes() 方法会返回字节数组,其中每个值正好相差 128。

Java 中是否存在已知的平台差异或其他东西可以解释这种不一致的行为,或者这更有可能是本机 FTDI 驱动程序中的问题?

有没有比引入丑陋的平台特定逻辑来修改读取或写入的每个字节更简洁的方法来解决它?

编辑

我不确定我的问题描述是否清楚。这是一个具体的例子。

我向 FTDI 设备请求 3 个字节,以确认它已准备好发送数据。我得到 [-91, -1, -1] 与文档中说期望“A5 FF FF”相匹配。我的代码是为了接受这个答案而编写的,一切都进行得很好。

我的同事得到 [37, 127, 127] 即“25 7F 7F”。由于这不是预期值,所以我的代码会报错并退出。

【问题讨论】:

  • Java 字节已签名。如果您的设备数据不是 8 位签名数据,则需要对数据进行符号扩展和屏蔽,例如int value = ((int)mybyte) & 0xFF;
  • 或自 java 8 起更惯用:Byte.toUnsignedInt(val)
  • 当我需要将字节值转换为十六进制时,我会使用它,但这并不能解决我的问题。我添加了一个具体示例进行说明。
  • 在每个字节中设置了高位,这导致负数,你的同事没有。你有在 Windows 上正常工作的本机代码吗?
  • JNA 使用 JNI 函数 SetByteArrayRegion 将内存直接复制到您的字节数组 (Pointer.getByteArray()) 中。那里没有什么魔法。有问题的 JVM 品牌/型号/版本是什么?

标签: jvm jna ftdi jnaerator


【解决方案1】:

调用 SetDataCharacteristics 以确保所有单词都使用 8 位解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多