夏普卡普:'。'使用 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() 方法的字符而不是空格的主要内容,如果未能解决你的问题,请参考以下文章

夏普850和9008分页器通用么

使用 Pandas 或 NumPy 的 Python 滚动夏普比率

求夏普手机的改java高手

Linux也疯狂 夏普Zaurus SL6000L评测

怎么进入夏普LCD工厂模式

夏普打印机驱动下载