C# sharppcap:“.”字符,而不是带有printHex()方法的空格

C# sharppcap:“.”字符,而不是带有printHex()方法的空格,c#,wireshark,pcap,sharppcap,C#,Wireshark,Pcap,Sharppcap,我正在使用SharpPcap库成功地打包“.pcap”文件 目标是从TCP/HTTP数据包中检索XML数据。为了做到这一点,我使用下面的代码删除空检查,以使其更具可读性: Packet packet = Packet.ParsePacket(eventArguments.Packet.LinkLayerType, eventArguments.Packet.Data); EthernetPacket ethernetPacket = ((EthernetPacket)packet); IpPa

我正在使用SharpPcap库成功地打包“.pcap”文件

目标是从TCP/HTTP数据包中检索XML数据。为了做到这一点,我使用下面的代码删除空检查,以使其更具可读性:

Packet packet = Packet.ParsePacket(eventArguments.Packet.LinkLayerType, eventArguments.Packet.Data);
EthernetPacket ethernetPacket = ((EthernetPacket)packet);

IpPacket ipPacket = (IpPacket)packet.Extract(typeof(IpPacket));

TcpPacket tcpPacket = (TcpPacket)packet.Extract(typeof(TcpPacket));

string rawData = tcpPacket.PrintHex();
撇开十六进制值和初始行不谈,我能够从rawData变量中提取XML数据,还有一个意想不到的副作用

.PrintHex返回“.”字符,而不是空格:

而不是:

<xml>Only text here</xml>
我明白了:

<xml>Only.text.here</xml>
我没有做任何奇怪的替换或字节转换。上述行为正是.PrintHex返回的结果

这可能是预期的结果吗? 更重要的是。。。如何解决或预防这一问题?请记住,无法区分有效的“.”和转换的“.” 图书馆版本:

.NET Framework:>4.5.2

Pcapsharp:4.2.0

尝试使用ToString方法的重写,它似乎完全符合您的期望

或者,如果这不起作用,可以自己从数据包中实现公共字符串PrintHex。如果您看一看反编译的代码,这里是您的问题:

    if ((int) bytes[index - 1] < 33 || (int) bytes[index - 1] > 126)
      str2 += ".";
    else
      str2 += Encoding.ASCII.GetString(new byte[1]
      {
        bytes[index - 1]
      });

这可能对其他人有帮助,因此我将根据公认的答案发布我的最终解决方案

其他功能:

利用字符串生成器提高性能 包括新行字符
非常感谢。这对我有用。作为旁注,可以包括ASCII代码10新行和13回车符,以便在内容中保持行分隔。
TcpPacket tcpPacket = (TcpPacket)packet.Extract(typeof(TcpPacket));
string rawData = tcpPacket.CustomPrintHex();

public static class Extensions
{
    public static string CustomPrintHex(this TcpPacket self)
    {
        byte[] bytes = self.BytesHighPerformance.Bytes;

        // copy / paste of `PrintHex()` with your custom conversion
    }
}
public class TcpPacketCustom: TcpPacket
{
    public static int AsciiRangeMin { get; } = 32;
    public static int AsciiRangeMax { get; } = 126;
    public static HashSet<int> AdditionalAsciiCodes { get; } = new HashSet<int> { 10, 13 }; //ascii codes of carriage and new line

    public TcpPacketCustom(ByteArraySegment byteArraySegment) : base(byteArraySegment) { }

    public new string PrintHex()
    {
        StringBuilder stringBuilder = new StringBuilder();
        foreach (byte b in this.BytesHighPerformance.Bytes)
        {
            int asciiCode = (int)b;
            if ( ((asciiCode < AsciiRangeMin) || (asciiCode > AsciiRangeMax)) && !AdditionalAsciiCodes.Contains(asciiCode) )
            {
                stringBuilder.Append(".");
            }
            else
            {
                stringBuilder.Append(Encoding.ASCII.GetString(new byte[1] { b }));
            }
        }
        return stringBuilder.ToString();
    }

}