package describer import ( "encoding/hex" "eruhs/core/parser" "fmt" ) type IPv4Describer struct { IPv4 *parser.IPv4 } func (i *IPv4Describer) GetHeader() []byte { return i.IPv4.Header } func (i *IPv4Describer) GetDetailDescribe() Describe { optionDescribe := make([]map[string]string, 0) for _, option := range i.IPv4.Options { optionDescribe = append(optionDescribe, map[string]string{ "类型": fmt.Sprintf("%d", option.OptionType), "长度": fmt.Sprintf("%d", option.OptionLength), "数据": hex.EncodeToString(option.OptionData), }) } protoName := "" switch i.IPv4.Protocol { case parser.IPv4ProtoICMP: protoName = "ICMP" case parser.IPv4ProtoIGMP: protoName = "IGMP" case parser.IPv4ProtoTCP: protoName = "TCP" case parser.IPv4ProtoUDP: protoName = "UDP" case parser.IPv4ProtoENCAP: protoName = "ENCAP" case parser.IPv4ProtoOSPF: protoName = "OSPF" case parser.IPv4ProtoSCTP: protoName = "SCTP" } return Describe{ 1: {"版本", fmt.Sprintf("%d", i.IPv4.Version)}, 2: {"首部长度", fmt.Sprintf("%d", i.IPv4.IHL)}, 3: {"区分服务", fmt.Sprintf("%d", i.IPv4.DS)}, 4: {"总长", fmt.Sprintf("%d", i.IPv4.TotalLength)}, 5: {"标识符", fmt.Sprintf("%d", i.IPv4.Id)}, 6: {"标志", fmt.Sprintf("%d", i.IPv4.Flags)}, 7: {"分片偏移", fmt.Sprintf("%d", i.IPv4.FragOffset)}, 8: {"存活时间", fmt.Sprintf("%d", i.IPv4.TTL)}, 9: {"应用层协议", protoName}, 10: {"首部校验和", fmt.Sprintf("%d", i.IPv4.Checksum)}, 11: {"源地址", i.IPv4.SrcIP.String()}, 12: {"目的地址", i.IPv4.DstIP.String()}, 13: {"选项字段", fmt.Sprintf("%+v", optionDescribe)}, 14: {"填充", fmt.Sprintf("%d Byte", len(i.IPv4.Padding))}, } }