【问题标题】:How can I declare an uint8_t array in Java如何在 Java 中声明一个 uint8_t 数组
【发布时间】:2019-06-23 19:59:40
【问题描述】:

我的 DLL 中有一个 C++ 函数,它需要一个 uint8_t 数组作为输入参数,所以该数组看起来像这样:

uint8_t input[input_length] = { 0x30, 0x41, 0x80, 0x8A...}; 

我想在 Java 中通过 JNA 使用这个函数,这意味着我必须在 Java 中创建一个 uint8_t 数组。我的第一种方法是创建一个字节数组,如:

byte[] input = { 0x30, 0x41, 0x80, 0x8A...}; 

但后来我意识到 C++ 中的 uint8_t 变量的范围为 0..255,但 Java 中的字节变量的范围为 -128..127,正如您所见,该数组包含超过127(如 0x8A),这意味着我在这里的 Java 声明无效。所以我的问题是Java中什么类型相当于uint8_t?

【问题讨论】:

  • Java 没有明确的无符号类型。
  • java.lang.Byte 有一些方法可以将字节视为无符号值。
  • 这有关系吗? 0xFF-1255,但它仍然是 0xFF。您不会丢失任何信息,只是显示方式不同。
  • 您必须考虑的唯一真正区别是在处理位操作时。在 C/C++ 中,我相信无符号/有符号类型的转换将根据类型自动使用有符号或无符号转换(尽管我现在找不到要引用的源),在 Java 中你必须明确使用> 用于有符号移位,>> 用于无符号移位。

标签: java c++ type-conversion jna


【解决方案1】:

Java 没有无符号类型。但这不是一个大问题,因为 Java 中的有符号溢出被定义为二进制补码,您可以将 byte 传递给 JNA 期望的 uint8_t。只是使用起来有点不方便:

byte[] input = { 0x30, 0x41, (byte)0x80, (byte)0x8A...};

要回读uint8_t,您可以使用(x & 0xFF) 去除符号扩展并将结果作为int 处理。

【讨论】:

    【解决方案2】:

    存储在一个字节中的值是一个确定的值,无论您如何解释它,有符号或无符号都很重要。

    您可以使用以下代码轻松验证这一点:

    byte test = (byte)255;
    System.out.println(test & 0xFF);
    

    输出255

    这意味着一旦您使用您需要的值创建了byte[](并且将每个值转换为字节允许您设置无符号值)。那么你就可以了,在你的 JNI 端你会使用:

    jbyte* data = GetByteArrayElements(...)
    

    如果需要(uint8_t*)data,您可以通过直接转换它来将其用作无符号字节数组。

    【讨论】:

      猜你喜欢
      • 2014-10-17
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 2011-05-03
      相关资源
      最近更新 更多