繁体   English   中英

元帅。用Java复制

[英]Marshal.Copy In Java

我正在尝试使用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 String

编辑

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM