0

我正在做这样的事情:

    [StructLayout(LayoutKind.Sequential)]
     public struct V_REQUEST
     {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]
        private string payLoad;

                public string payLoadStr
                {
                    set
                    {
                        if (value != null)                                                               
                            payLoad = value.PadRight(value.Length+1, '\0').ToCharArray();
                    }
                }

     }  
   public object somemethod(byte[] bytes_data)
   {
      string strrequest = Encoding.GetString(bytes_data);

      myobj.payLoad = strrequest;
   }

这总是会弄乱我的数据。我的意思是我会在我的数据中看到一些奇怪的字符。

然后我用这个替换了我的财产:

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)]
private byte[] payLoad;

            public string payLoadStr
            {
                set
                {
                    if (value != null)   
                    {                                    
                      for (int i = 0; i < value.Length; i++)
                        payLoad[i] = value[i];
                    }
                }
             }

而且效果很好!!!为什么 ToCharArray 不安全?

4

2 回答 2

1
  1. 您的第一个示例无法编译。你不能分配char[]string.
  2. 第一个示例中的调用PadRight什么都不做,因为您value.Length作为参数传递(显然,只要字符串已经存在,就不需要填充)。
  3. 除非您将实例传递给非托管代码,否则该[MarshalAs]属性将被忽略,并且没有迹象表明您正在这样做。
  4. 枚举UnmanagedType没有成员。ByValStr它确实有一个成员ByValTStr

我的猜测是您没有指定正确的字符集,并且非托管代码需要单字节编码但接收到 2 字节 UTF-16 编码字符串。根据以下文件ByValTStr

用于出现在结构中的内联、固定长度的字符数组。使用的字符类型由应用于包含结构的参数ByValTStr确定。System.Runtime.InteropServices.CharSetSystem.Runtime.InteropServices.StructLayoutAttribute

因此,您可能忘记将以下内容添加到包含结构中:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
于 2013-06-06T15:44:01.723 回答
-1

mono 是否有从 char[] 到 string 的隐式转换?

只是想知道为什么 payLoad 在第一个示例中是一个字符串,而在第二个示例中是一个 char[]

于 2013-06-06T15:42:32.210 回答