Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在mono下对字符串使用ToCharray是否不安全?_C#_String_Mono_Unmanaged - Fatal编程技术网

C# 在mono下对字符串使用ToCharray是否不安全?

C# 在mono下对字符串使用ToCharray是否不安全?,c#,string,mono,unmanaged,C#,String,Mono,Unmanaged,我是这样做的: [StructLayout(LayoutKind.Sequential)] public struct V_REQUEST { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)] private string payLoad; public string payLoadStr {

我是这样做的:

    [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];
                    }
                }
             }
[Marshallas(UnmanagedType.ByValArray,SizeConst=1024)]
专用字节[]有效载荷;
公共字符串payLoadStr
{
设置
{
if(值!=null)
{                                    
for(int i=0;i

而且它工作得很漂亮!!!为什么ToCharray不安全?

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

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

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

    用于显示在结构中的内嵌、固定长度字符数组。与
    ByValTStr
    一起使用的字符类型由应用于包含结构的
    System.Runtime.InteropServices.CharSet
    参数的
    System.Runtime.InteropServices.StructLayoutAttribute
    确定

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

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]