Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Java中的Marshal.Copy_C#_Java_Jna - Fatal编程技术网

C# Java中的Marshal.Copy

C# Java中的Marshal.Copy,c#,java,jna,C#,Java,Jna,我试图使用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

我试图使用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)

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

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

B) 使用
Native.toString(byte[])
将字节数组转换为Java
字符串

编辑

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


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

1只是一个测试,并不打算用当前版本发布它