我正在侦听套接字并将字节数组转换为结构。但我总是在随机数据包上出错
<块引用>试图读取或写入受保护的内存。这通常表明其他内存已损坏
我的结构:
[StructLayout(LayoutKind.Sequential, Pack =1)]
public struct InputFrameStruct
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
public string type;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
private char[] delFild;//: i-
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 11)]
public string timeStart;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 3)]
private string delTimeSpase;//-t1
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
public string timeTick;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
private char[] delTime;//.0000
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 11)]
public string freq;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)]
private char[] delOther; // 89% 0.000 179
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
private char[] direction;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 112)]
public char[] LCWData;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 532)]
public char[] data;
}
使用结构:
private async void UdpReceiver_OnUDPPacket(byte[] e)
{
var structData = ConvertCustomerData.ByteToStruct<InputFrameStruct>(e);
IProcessing processing;
switch (structData.type)
将字节[]转换为结构
public T ByteToStruct<T>(byte[] rawData) where T : struct
{
GCHandle pinnedRawData = GCHandle.Alloc(rawData, GCHandleType.Pinned);
try
{
var pinnedRawDataPtr = pinnedRawData.AddrOfPinnedObject();
return (T)Marshal.PtrToStructure(pinnedRawDataPtr, typeof(T));
}
catch (Exception e)
{
Console.WriteLine($"error conver tu struct: {e} {typeof(T).ToString()}");
return default;
}
finally
{
pinnedRawData.Free();
}
}