1.应用背景
底端设备有大量网络报文(字节数组):心跳报文,数据采集报文,告警报文上报。需要有对应的报文结构去解析这些字节流数据。
2.结构体解析
由此,我第一点就想到了用结构体去解析。原因有以下两点:
2.1.结构体存在栈中
类属于引用类型,存在堆中;结构体属于值类型,存在栈中,在一个对象的主要成员为数据且数据量不大的情况下,使用结构会带来更好的性能。
2.2.结构体不需要手动释放
属于托管资源,系统自动管理生命周期,局部方法调用完会自动释放,全局方法会一直存在。
3.封装心跳包结构体
心跳协议报文如下:

对应结构体封装如下:
[StructLayout(LayoutKind.Sequential, Pack = 1)] // 按1字节对齐
public struct TcpHeartPacket
{
[<span class="hljs-meta">MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)</span>] <span class="hljs-comment">//结构体内定长数组</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">byte</span>[] head;
<span class="hljs-keyword">public</span> <span class="hljs-keyword">byte</span> type;
[<span class="hljs-meta">MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)</span>]
<span class="hljs-keyword">public</span> <span class="hljs-keyword">byte</span>[] length;
[<span class="hljs-meta">MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)</span>]
<span class="hljs-keyword">public</span> <span class="hljs-keyword">byte</span>[] Mac;
[<span class="hljs-meta">MarshalAs(UnmanagedType.ByValArray, SizeConst = 104)</span>]
<span class="hljs-keyword">public</span> <span class="hljs-keyword">byte</span>[] data;<span class="hljs-comment">//数据体</span>
[<span class="hljs-meta">MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)</span>]
<span class="hljs-keyword">public</span> <span class="hljs-keyword">byte</span>[] tail;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4








