我做的是这样的事情:
[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不安全?
答案 0 :(得分:1)
char[]
分配给string
。PadRight
的调用什么也没做,因为你传递了value.Length
作为参数(显然,只要它已经是一个字符串就不需要填充)。[MarshalAs]
属性,并且没有迹象表明您正在这样做。UnmanagedType
枚举没有成员ByValStr
。它有一个成员ByValTStr
。我的猜测是你没有指定正确的字符集,非托管代码期望单字节编码但是接收一个2字节的UTF-16编码字符串。根据{{1}}的文档:
用于出现在结构中的内嵌式固定长度字符数组。与
ByValTStr
一起使用的字符类型由应用于包含结构的ByValTStr
的{{1}}参数确定。
所以你可能忘了将以下内容添加到包含结构中:
System.Runtime.InteropServices.CharSet
答案 1 :(得分:-1)
mono是否有从char []到string的隐式转换?
只是想知道为什么payLoad在第一个例子中是一个字符串而在第二个例子中是char []