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
文档:
用于显示在结构中的内嵌、固定长度字符数组。与ByValTStr
一起使用的字符类型由应用于包含结构的System.Runtime.InteropServices.CharSet
参数的System.Runtime.InteropServices.StructLayoutAttribute
确定
因此,您可能忘记将以下内容添加到包含结构中:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]