c# - Java 中的 Marshal.Copy

标签 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.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 )。

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

关于c# - Java 中的 Marshal.Copy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18073737/

相关文章:

java - Java UDP 多线程最佳实践

java - 如何接受/查找来自 opc ua 服务器的证书?

java - 使用 JNA 获取正在运行的进程

java - JNA 联合结构映射

c# - SQL Server : sp_executesql parameters not working

c# - 我最终采用了什么设计模式?

java - 正则表达式将SQL格式转换为java格式

c# - java中通过JNA访问.net dll

c# - 我想创建一个程序,返回基本的 AzureAD 信息,而不将其绑定(bind)到一个租户

c# - 我如何为文本字段生成动态 ID 并从 asp.net 4 mvc3 中的模型数组获取数据