1

我正在尝试使用 JNA 将一些 C# 代码转换为 java,但我被困在最后一个函数上。

在 C# 中,它被称为

Marshal.Copy

这是我到目前为止尝试过的

byte[] string = new byte[tSecDec.SECItemLen];
Pointer ptr = new Memory(string.length);
ptr.read(tSecDec.SECItemData, string, 0, tSecDec.SECItemLen);
System.out.println(Native.toString(string));

但它没有用,因为我收到了这个错误

Exception in thread "main" java.lang.IndexOutOfBoundsException: Bounds exceeds available space : size=7, offset=419439024
at com.sun.jna.Memory.boundsCheck(Memory.java:186)
at com.sun.jna.Memory.read(Memory.java:203)
4

1 回答 1

2

您正在分配tSecData.SECItemLen-1字节,但您要求复制tSecDec.SECItemLen字节。如错误消息所示,请求的复制范围超出了可用(分配)空间。

A) 分配全尺寸,不要减一。

B)Native.toString(byte[])用于将字节数组转换为 Java String

编辑

第一个参数Pointer.read()是一个偏移量。对于您分配的内存,如果它不是零,加上tSecDec.SECItemLen您的长度将超过您分配的内存的边界(因为它分配的长度为tSecDec.SECItemLen)。

无论如何,该代码都是伪造的-您正在从新分配的内存中读取一个字符串,这充其量会给您一个空字符串(如果内存为零)。

于 2013-08-06T17:48:12.870 回答