夏普卡普:'。'使用 printHex() 方法的字符而不是空格
Posted
技术标签:
【中文标题】夏普卡普:\'。\'使用 printHex() 方法的字符而不是空格【英文标题】:sharppcap: '.' characters instead of spaces with printHex() method夏普卡普:'。'使用 printHex() 方法的字符而不是空格 【发布时间】:2019-05-05 03:38:34 【问题描述】:我正在使用 SharpPcap 库成功解析“.pcap”文件。
目标是从 TCP/HTTP 数据包中检索 XML 数据。为了做到这一点,我使用了下面的代码(删除了 null 检查以使其更具可读性):
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 框架:> 4.5.2
Pcapsharp:4.2.0
【问题讨论】:
【参考方案1】:尝试使用 ToString()
方法的覆盖,这似乎完全符合您的预期。
(可选)如果这不起作用,请自行从Packet
实施public string PrintHex()
。如果你看一下反编译的代码,这就是你的问题:
if ((int) bytes[index - 1] < 33 || (int) bytes[index - 1] > 126)
str2 += ".";
else
str2 += Encoding.ASCII.GetString(new byte[1]
bytes[index - 1]
);
只有dec
代码从 33 到 126 的字符将保持不变,其余字符将替换为 .
(包括 space
,即 32 http://www.asciitable.com/)。由于BytesHighPerformance.Bytes
是公开的,因此您可以按照这些思路轻松编写自己的扩展方法。
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
【讨论】:
谢谢。它对我有用。附带说明一下,可以包含 ASCII 代码 10(新行)和 13(回车),以便在内容中保持行分隔。【参考方案2】:这可能对其他人有帮助,所以我发布了我的最终解决方案(基于接受的答案)。
附加功能:
利用字符串生成器提高性能 包括换行符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();
【讨论】:
以上是关于夏普卡普:'。'使用 printHex() 方法的字符而不是空格的主要内容,如果未能解决你的问题,请参考以下文章