2

これは、libeay32.dll ( openssl プロジェクト) の関数です。

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

C# でそれを記述する方法 (バイト [] を取得したい場合)?

コード:

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

結果はユニコードだと思うので、私はこれが好きではありません。

答え

        [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);
4

2 に答える 2

2

手動で行うと思います.Marshal.Copyを使用して、配列をアンマネージドメモリからマネージドバイト[]にコピーする必要があります。(注、コードはテストされていません)。

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);
于 2013-05-20T17:48:43.613 に答える
0

を使用して、正しいエンコーディングで文字列を取得できます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;
于 2013-05-20T19:15:26.150 に答える