【问题标题】:How to get the value from Marshal in c#如何在 c# 中从 Marshal 获取值
【发布时间】:2012-12-27 10:41:04
【问题描述】:

我有以下几行代码:

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 做错了什么吗?

请帮帮我

【问题讨论】:

    标签: c# bytearray marshalling


    【解决方案1】:

    您缺少从 byte[] 到字符串的转换,但您必须定义什么是编码。这可能有效:

    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 (=Default)

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-25
        • 1970-01-01
        • 2013-05-02
        • 1970-01-01
        相关资源
        最近更新 更多