簡體   English   中英

將 `byte[]` 從 .NET 編組到 C 中的 `const u8*`

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM