我有一个定义为
的结构[StructLayout(LayoutKind.Sequential,Pack=1)]
private struct networkMessage
{
public messageType type;
public string message;
}
我有这个函数将结构转换为byte[]
private byte[] ConvertToByteArray(networkMessage inStruct)
{
int structSize = Marshal.SizeOf(inStruct);
byte[] byteArray = new byte[structSize];
IntPtr memPtr = IntPtr.Zero;
try
{
memPtr = Marshal.AllocHGlobal(structSize);
Marshal.StructureToPtr(inStruct, memPtr, false);
Marshal.Copy(memPtr, byteArray, 0, structSize);
}
finally
{
if (memPtr != IntPtr.Zero)
{
Marshal.FreeHGlobal(memPtr);
}
}
foreach (byte b in byteArray)
{
Console.WriteLine(b + " ");
}
return byteArray;
}
这将转换回结构
private networkMessage ConvertFromByteArray(byte[] inByte)
{
foreach (byte b in inByte)
{
Console.WriteLine(b);
}
GCHandle handle = GCHandle.Alloc(inByte, GCHandleType.Pinned);
networkMessage outStruct = (networkMessage) Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(networkMessage)); //---Exception here
return outStruct;
}
这用于TCP应用程序,它既充当服务器又充当客户端,以便在两台计算机上运行相同的可执行文件。在对象构造函数中测试转换表明它工作正常,但来自另一台计算机的字节数组会导致访问冲突异常。打印出两个系统上的字节表明它们是相同的。可能是什么问题呢?我认为这可能与结构有关吗?
答案 0 :(得分:1)
这不起作用。
尝试此操作:将message
设置为长度超过16个字符的字符串,然后查看Marshal.SizeOf(inStruct)
的值。无论message
的长度如何,64位版本为12,32位版本为8。
正确的解决方案是使用序列化来转换数据。
您可能需要查看NetTcpBinding
,DataContracts可以使用JSON serialization来序列化数据。
另外,请查看{{3}}。