4

次のコード行があります。

public static string getTrack1(string track1, int len)
{
  IntPtr track1Ptr = UnsafeNativeMethods.Decrypt(track1, len);
  Byte[] track1b = new Byte[200];
  Marshal.Copy(track1Ptr, track1b, 0, track1b.Length);
   return track1b.ToString();
}

復号化メソッドの減速は次のとおりです。

internal static class UnsafeNativeMethods
{
  [DllImport(_dllLocation, CallingConvention = CallingConvention.Cdecl)]
  public static extern IntPtr Decrypt(string track1, int dataLen);
 }

unsigned char*コードから戻ってきましたが、visual c++コードからdllを呼び出すと、値ではなくc#常に「System.Byte[]」が返されます。私はここで何か間違ったことをしていmarshalますか?

ここで私を助けてください

4

2 に答える 2

1

Byte[].ToString()メソッドは常に を返しますSystem.Byte[]

バイト配列を文字列表現に変換するには、次のようにする必要があります。

public static string ByteArrayToHexString(byte[] source)
{
    StringBuilder builder = new StringBuilder(source.Length * 3);

    foreach (byte b in source)
    {
        builder.Append(b.ToString("X2"));
        builder.Append(' ');
    }

    return builder.ToString();
}
于 2012-12-27T10:51:41.567 に答える
1

byte[] から string への変換がありませんが、エンコーディングを定義する必要があります。これはうまくいくかもしれません:

public static string getTrack1(string track1, int len)
{
  IntPtr track1Ptr = UnsafeNativeMethods.Decrypt(track1, len);
  Byte[] track1b = new Byte[200];
  Marshal.Copy(track1Ptr, track1b, 0, track1b.Length);
   return Encoding.Default.GetString(track1b);
}

しかし、これを行う方がよいでしょう。

public static string getTrack1(string track1, int len)
{
  IntPtr track1Ptr = UnsafeNativeMethods.Decrypt(track1, len);
  return Marshal.PtrToStringAnsi(track1Ptr);
}

エンコーディングが Ansi の場合 (=デフォルト)

于 2012-12-27T10:51:56.860 に答える