如何在Java中声明一个uint8_t数组

6

我有一个C++函数在我的DLL中,需要一个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中的byte变量的范围为-128..127。正如您所看到的,此数组包含超过127的值(如0x8A),这意味着我的Java声明在这里无效。因此,我的问题是:Java中的哪种类型相当于uint8_t?


3
Java没有明确的无符号类型。 - Shawn
java.lang.Byte有一些方法可以将字节视为无符号值。 - Shawn
3
重要吗?0xFF可以是-1或255,但它仍然是0xFF。你不会失去任何信息,只是显示方式不同。 - NathanOliver
唯一真正需要考虑的区别是在处理位操作时。在 C/C++ 中,我相信对无符号/带符号类型进行的移位操作将自动使用带符号或无符号移位,具体取决于类型(尽管我现在找不到引用的来源),而在 Java 中,您必须明确使用 << 或 >> 进行有符号移位,<<< 或 >>> 用于无符号移位。 - Shawn
2个回答

11

Java没有无符号类型。不过这并不是一个大问题,因为在Java中有符号溢出被定义为二进制补码,你可以只将byte传递给需要uint8_t的JNA位置。只是使用起来稍微有点不方便:

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

要读取 uint8_t,您需要执行 (x & 0xFF) 来去除符号扩展,并将结果作为 int 处理。


1

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

您可以使用以下代码轻松验证此内容:

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

这意味着一旦你创建了包含所需值的byte[](并将每个值强制转换为字节以设置无符号值),您将输出255。然后,您可以在JNI端使用以下代码:

jbyte* data = GetByteArrayElements(...)

如果需要,您可以直接将其强制转换为无符号字节数组并使用:(uint8_t*)data


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接