C# sharppcap:“.”字符,而不是带有printHex()方法的空格
我正在使用SharpPcap库成功地打包“.pcap”文件 目标是从TCP/HTTP数据包中检索XML数据。为了做到这一点,我使用下面的代码删除空检查,以使其更具可读性: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
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();
}
}