如何在C#中从Marshal获取值

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);
 }

我从visual c++代码中返回unsigned char*,但每当我从c#代码调用dll时,它总是返回"System.Byte[]"而不是值。我在marshal方面做错了什么吗?

请帮帮我。

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();
}

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 (=默认值)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接