2013-05-20 5 views
2

Ceci est la fonction de libeay32.dll (openssl project):C non signé `char ** out` à C#` octet [] `

int i2o_ECPublicKey (EC_KEY * key, unsigned char ** out) 

Comment décrire en C# (si je veux obtenir un octet [])?

code:

[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] 
public extern static int i2o_ECPublicKey (IntPtr encKey, StringBuilder outPar); 

Je n'aime pas, parce que je pense que le résultat est unicode.

Réponse

 [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] 
     public extern static int i2o_ECPublicKey(IntPtr encKey, ref IntPtr outPar); 

     [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] 
     public static extern int i2o_ECPublicKey(IntPtr encKey, int outPar); 


     //Pass *out as null for required buffer length. 
     int reqLen = i2o_ECPublicKey(k, 0); 

     Byte[] outBuf = new Byte[reqLen]; 
     IntPtr unmanagedOut = Marshal.AllocCoTaskMem(outBuf.Length); 
     int res = i2o_ECPublicKey(k, ref unmanagedOut); 
     if (res == reqLen) 
     { 
      unmanagedOut -= reqLen; // because i2o_ECPublicKey add size to unmanagedOut 
      Marshal.Copy(unmanagedOut, outBuf, 0, outBuf.Length); 
     } 
     Marshal.FreeCoTaskMem(unmanagedOut); 

Répondre

2

je crois le faire manuellement, vous devez utiliser Marshal.Copy pour copier le tableau de la mémoire non gérée dans un octet géré []. (Remarque: le code n'a pas été testé).

public extern static int i2o_ECPublicKey (IntPtr encKey, ref IntPtr outPar); 

... 
//Pass *out as null for required buffer length. 
int reqLen = i2o_ECPublicKey(key, null); 

Byte[] outBuf = new Byte[reqLen]; 
IntPtr unmanagedOut = Marshal.AllocCoTaskMem(outBuf.Length); 
int res = i2o_ECPublicKey(key, ref unmanagedOut); 
if (res == 1) { 
    Marshal.Copy(unmanaged, outBuf, 0, outBuf.Length); 
} 
Marshal.FeeCoTaskMem(unmanagedOut); 
0

vous pouvez obtenir la chaîne avec le codage correct par l'utilisation de GetBytes

StringBuilder outPar; 
string result = ""; 
byte[] parbytes = System.Text.Encoding.Unicode.GetBytes(outPar.ToString()); 
foreach(byte parbyte in parbytes) 
{ 
    result+= Convert.ToChar(parbyte); 
} 
return result; 
Questions connexes