在 c++ 中解析数据包数据的最佳方法是什么?

What's the best way to parse a packet data in c++?

本文关键字:最佳 方法 是什么 数据 数据包 c++      更新时间:2023-10-16

我正在将德尔福应用程序转码为C++,并且在获得正确方法来处理C++中的数据包标头的情况下遇到了问题。

标头在 UCHAR buf 中以"dword"的形式出现,我不想像这样:if (packet[0] == 0xFF && packet[1] == 0xFF...(;

例如:德尔福 使用开关盒:

case PDword(@Packet[6])^ of
$68FB0200:
begin
//Dword match correctly
End;
end;

有没有办法在德尔菲的例子这样的C++中做同样的事情?

已经检查了一些甲基苯丙胺,但从未通过比较。

UCHAR               *Packet ;
Packet = ParsePacket(buf->Buf, buf->Size);
// The ParsePacket Returns FB 00 00 00 78 00 01 F3 02 FD
DWORD Op1 = 0x01F302FD;
DWORD *p_dw = (DWORD*) Packet[6];
if (p_dw == Op1)
{
//Dword never match...
}

是的,可移植的 C(和 C++(方式是:

DWORD const Op1 = 0x01F302FD;
if (0 == memcmp(Packet + 6, &Op1, sizeof Op1)) { ... }

请注意,我们尚未尝试将Packet+6处的字节作为 32 位数量访问......他们很可能因此而错位。 我们只是在问那里是否存在与Op1中存在的相同的 4 字节序列。

DWORD *p_dw = (DWORD*) Packet[6]的明显问题是您将值作为地址。你可能的意思是DWORD *p_dw = (DWORD*)&(Packet[6]).

但是请注意,由于两个原因,您会遇到其他麻烦:

首先,对齐可能是错误的,因此收到的指针不是用于取消引用 DWORD 的有效地址。这是未定义的行为。

其次,你依赖于特定的恩迪亚。

要克服第一个问题,您可以使用memcpy

DWORD Op2 = 0;
memcpy(&Op2,Packet+6,sizeof(Op2));

为了克服第一个和第二个问题,您需要自己对字节求和,例如:

DWORD Op2 = Packet[6]<<24 | Packet[7]<<16 | Packet[8]<<8 | Packet[9]