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. 列挙にはUnmanagedTypemember がありませんByValStr。それはメンバーを持っていますByValTStr

私の推測では、正しい文字セットが指定されておらず、アンマネージ コードは 1 バイトのエンコーディングを想定していますが、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が最初の例では文字列で、2番目の例ではchar []なのか疑問に思っています

于 2013-06-06T15:42:32.210 に答える