元帅结构线程

时间:2021-07-29 10:20:04

标签: c# multithreading struct byte

我正在侦听套接字并将字节数组转换为结构。但我总是在随机数据包上出错

<块引用>

试图读取或写入受保护的内存。这通常表明其他内存已损坏

enter image description here

我的结构:

[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();
        }

    }

0 个答案:

没有答案
相关问题