public Packet(byte[] raw) : this(raw, DateTime.Now) {}
/// <summary>
/// 初始化一个数据包类
/// </summary>
/// <param name="raw">原始IP数据包字节.</param>
/// <param name="time">抓取时间.</param>
/// <exception cref="ArgumentNullException"><paramref name="raw"/></exception>
/// <exception cref="ArgumentException"><paramref name="raw"/> 无效的IP数据包.</exception>
public Packet(byte[] raw, DateTime time) {
if (raw == null)
throw new ArgumentNullException();
if (raw.Length < 20)
throw new ArgumentException(); 
m_Raw = raw;
m_Time = time;
请给解释一下: m_Version = (raw[0] & 0xF0) >> 4;        
                            m_HeaderLength = (raw[0] & 0x0F) * 4;
if ((raw[0] & 0x0F) < 5)
throw new ArgumentException(); // 无效的报头
m_Precedence = (Precedence)((raw[1] & 0xE0) >> 5);
m_Delay = (Delay)((raw[1] & 0x10) >> 4);
m_Throughput = (Throughput)((raw[1] & 0x8) >> 3);
m_Reliability = (Reliability)((raw[1] & 0x4) >> 2);
m_TotalLength = raw[2] * 256 + raw[3];
if (m_TotalLength != raw.Length)
throw new ArgumentException(); // 无效的数据包大小
m_Identification = raw[4] * 256 + raw[5];
m_TimeToLive = raw[8];
if (Enum.IsDefined(typeof(Protocol), (int)raw[9]))
m_Protocol = (Protocol)raw[9];
else
m_Protocol = Protocol.Other;
m_Checksum = new byte[2];
m_Checksum[0] = raw[11];
m_Checksum[1] = raw[10];
m_SourceAddress = new IPAddress(BitConverter.ToUInt32(raw, 12));
m_DestinationAddress = new IPAddress(BitConverter.ToUInt32(raw, 16));
if (m_Protocol == Protocol.Tcp || m_Protocol == Protocol.Udp) {
m_SourcePort = raw[m_HeaderLength] * 256 + raw[m_HeaderLength + 1];
m_DestinationPort = raw[m_HeaderLength + 2] * 256 + raw[m_HeaderLength + 3];
} else {
m_SourcePort = -1;
m_DestinationPort = -1;
}
}