簡體   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