在单声道下的字符串上使用ToCharArray是不安全的吗?

时间:2013-06-06 15:37:43

标签: c# string mono unmanaged

我做的是这样的事情:

    [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不安全?

2 个答案:

答案 0 :(得分:1)

  1. 您的第一个示例无法编译。您无法将char[]分配给string
  2. 第一个示例中对PadRight的调用什么也没做,因为你传递了value.Length作为参数(显然,只要它已经是一个字符串就不需要填充)。
  3. 除非您将实例传递给非托管代码,否则将忽略[MarshalAs]属性,并且没有迹象表明您正在这样做。
  4. UnmanagedType枚举没有成员ByValStr。它有一个成员ByValTStr
  5. 我的猜测是你没有指定正确的字符集,非托管代码期望单字节编码但是接收一个2字节的UTF-16编码字符串。根据{{​​1}}的文档:

      

    用于出现在结构中的内嵌式固定长度字符数组。与ByValTStr一起使用的字符类型由应用于包含结构的ByValTStr的{​​{1}}参数确定。

    所以你可能忘了将以下内容添加到包含结构中:

    System.Runtime.InteropServices.CharSet

答案 1 :(得分:-1)

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

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