[英]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.