如何用C# .NET库将单条CSV记录转为Wireshark可识别的pcap记录?
把CSV记录转成Wireshark可识别的PCAP文件(.NET实现)
首选工具库:SharpPcap
直接通过NuGet安装:Install-Package SharpPcap,这是.NET生态里活跃的PCAP读写库,完美适配Wireshark的PCAP格式。
分步实现代码
1. 解析CSV字段
先把你的CSV拆成可用的字段:
var csvLine = "\"1\",\"0.000000\",\"2.1.1.2\",\"2.1.1.1\",\"IPv4\",\"1010\",\"Fragmented IP protocol (proto=ICMP 1, off=0, ID=b5d0) [Reassembled in #2]\""; var parts = csvLine.Split(new[] { "\",\"" }, StringSplitOptions.RemoveEmptyEntries) .Select(p => p.Trim('"')) .ToArray(); // 提取核心数据 var timestamp = TimeSpan.Parse(parts[1]); var srcIp = IPAddress.Parse(parts[2]); var dstIp = IPAddress.Parse(parts[3]); var totalLen = int.Parse(parts[5]); // 从描述里抠出IP分片关键参数 var ipId = ushort.Parse("b5d0", System.Globalization.NumberStyles.HexNumber); var proto = 1; // ICMP协议号 var fragOffset = 0;
2. 构造完整的网络数据包
因为CSV记录是IPv4分片,得先搭以太网帧(Wireshark默认认以太网链路层),再做IPv4分片头部:
// 填个合法MAC就行,CSV没给不影响IPv4解析 var srcMac = PhysicalAddress.Parse("00:11:22:33:44:55"); var dstMac = PhysicalAddress.Parse("AA:BB:CC:DD:EE:FF"); var ethFrame = new EthernetPacket(srcMac, dstMac, EthernetType.None); // 构造带分片标识的IPv4头部 var ipHeader = new IPv4Packet(srcIp, dstIp) { Id = ipId, Protocol = (IPv4Protocol)proto, FragmentOffset = (ushort)(fragOffset << 3), // PCAP里偏移量单位是8字节,要左移3位 Flags = IPv4Flags.MoreFragments, // 描述说在#2重组,所以标记还有后续分片 TotalLength = (ushort)totalLen, TimeToLive = 64 }; // 填充空负载(CSV没给具体内容,填0字节不影响Wireshark识别分片) var payload = new byte[totalLen - ipHeader.HeaderLength]; Array.Fill(payload, (byte)0); ipHeader.PayloadPacket = new Packet(payload); // 把IPv4包挂到以太网帧下 ethFrame.PayloadPacket = ipHeader; // 设置时间戳:PCAP用UTC时间,这里假设0.000000是捕获起始点,所以用当前UTC时间减偏移 var captureStart = DateTime.UtcNow - timestamp; ethFrame.Timestamp = new DateTimeOffset(captureStart);
3. 写入PCAP文件
用SharpPcap的PcapWriter直接输出:
using var pcapWriter = new PcapWriter("output.pcap", LinkLayers.Ethernet); pcapWriter.Write(ethFrame);
几个关键细节
- MAC地址:随便填合法格式就行,Wireshark主要看上层IPv4内容,不影响解析
- IP分片偏移:必须左移3位,因为PCAP里的偏移量是以8字节为单位的,和你CSV里的
off=0对应 - 分片标记:因为描述里写了
[Reassembled in #2],所以要开MoreFragments标记,Wireshark才会识别成待重组的分片 - 时间戳:如果不需要严格对应,直接用
DateTimeOffset.UtcNow也行,Wireshark会正常显示
内容的提问来源于stack exchange,提问作者Subin Suthan
相关产品推荐
相关产品推荐

