[英]Marshalling `byte[]` from .NET to `const u8*` in C
我有這個 C 函數:
void ECRYPT_keysetup(ECRYPT_ctx* ctx, const u8* key, u32 keysize, u32 ivsize);
加載一些關鍵字節來加密上下文,例如:
{0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0}
我想將byte[]
從我的 .NET 應用程序傳遞給ECRYPT_keysetup
。 問題是要編組const u8*
。 有什么建議?
ECRYPT_ctx
是一個結構體:
u32 lfsr[1036];
u32 nfsr[1036];
u32 * nptr;
u32 * lptr;
u32 count;
const u8 * key;
u32 keysize;
u32 ivsize;
我有它的 .NET 表示:
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1036)]
public UInt32[] lfsr;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1036)]
public UInt32[] nfsr;
public UIntPtr nptr;
public UIntPtr lptr;
public UInt32 count;
public byte[] key;
public UInt32 keysize;
public UInt32 ivsize;
可能是我的錯誤在於結構聲明?
解決方案1
映射您的類型並使用MarshalAs
屬性:
[DllImport("Mylib.dll")]
private static extern void ECRYPT_keysetup(
[In][MarshalAs(UnmanagedType.LPStruct)] ref ECRYPT_ctx ctx,
[In][MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)]byte[] key,
uint keysize,
uint ivsize);
// define whatever you have here (you can use Sequential layout without offsets, too)
[StructLayout(LayoutKind.Explicit)]
private struct ECRYPT_ctx
{
[FieldOffset(0)]
internal int someInt32;
[FieldOffset(4)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
internal byte[] someBytes;
}
解決方案2
使用指針並手動編組所有內容:
[DllImport("Mylib.dll")]
private static extern void ECRYPT_keysetup(IntPtr ctx, IntPtr key, uint keysize, uint ivsize);
在這種情況下,您應該手動管理分配和處置:
byte[] key = new byte[128]; // use the size you need, of course
IntPtr keyPtr = Marshal.AllocHGlobal(key.Length);
Marshal.Copy(key, 0, keyPtr, key.Length);
ECRYPT_ctx ctx = new ECRYPT_ctx();
IntPtr ctxPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(ECRYPT_ctx)));
Marshal.StructureToPtr(ctx, ctxPtr, false);
ECRYPT_keysetup(ctxPtr, keyPtr, (uint)key.Length, ivsize);
Marshal.FreeHGlobal(keyPtr);
Marshal.DestroyStructure(ctxPtr, typeof(ECRYPT_ctx));
Marshal.FreeHGlobal(ctxPtr);
備注:我將所有參數都視為輸入參數。 如果您在緩沖區中得到一些東西,請將它們定義為[In, Out]
,並在解決方案 2 中使用Marshal.PtrToStructure
方法將指針轉換為托管結構。
也許[MarshalAs(UnmanagedType.LPArray)] Byte[] key
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.