java jna - get byte array by reference java.lang.IndexOutOfB



我正在使用JNA,在获取字节数组时遇到一个奇怪的错误。

我使用此代码:

PointerByReference mac=new PointerByReference();
NativeInterface.getMac(mac);
mac.getPointer().getByteArray(0,8)

它抛出一个 IndexOutOfBoundsException:边界超出可用空间:size=4,偏移量=8,如果我确定返回的字节是 8 字节长度。我试图将该数组作为字符串:

mac.getPointer().getString(0)

在这里,我成功地获得了字符串 8 个字符的长度。你能理解为什么吗?

谢谢。

PointerByReference.getValue()返回您要查找的PointerPointerByReference.getPointer()返回其地址。

mac.getPointer().getByteArray(0, 8) 尝试从PointerByReference分配的内存(这是一个指针)中读取 8 个字节,并将这些字节放入 Java 原始数组中。 您要求 8 个字节,但只分配了 4 个字节,因此会出现相应的错误。

mac.getPointer().getString(0)试图从为指针值分配的内存中读取 C 字符串(就像const char *一样,并将该 C 字符串转换为 Java String。 它只在 Java 端边界检查字符串的开头,因此它会继续读取内存(即使它在技术上是越界的),直到找到零值。

编辑

mac.getValue().getByteArray(0, 8) 会给你最初尝试获取的内容(一个 8 字节的数组)。

编辑

如果你被调用的函数应该写入缓冲区(而不是写入缓冲区的地址),那么你应该改变它的签名以接受byte[],例如

byte[] buffer = new byte[8];
getMac(buffer);

最新更新