[英]What's the best way to parse a packet data in c++?
我正在將 Delphi 應用程序轉碼為 C++ 並遇到問題,無法正確處理 C++ 中的數據包標頭的情況。
標頭在 UCHAR buf 中以“Dword”的形式出現,我不想像這樣:if (packet[0] == 0xFF && packet[1] == 0xFF...);
例如:Delphi 使用開關盒:
case PDword(@Packet[6])^ of
$68FB0200:
begin
//Dword match correctly
End;
end;
有沒有辦法像 Delphi 示例一樣在 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])
。
但是請注意,由於兩個原因,您會遇到額外的麻煩:
首先,alignment 可能是錯誤的,因此接收到的指針不是用於取消引用 DWORD 的有效地址。 這是未定義的行為。
其次,您依賴於特定的字節序。
要克服第一個問題,您可以使用memcpy
:
DWORD Op2 = 0;
memcpy(&Op2,Packet+6,sizeof(Op2));
為了克服第一個和第二個問題,您需要自己對字節求和,例如:
DWORD Op2 = Packet[6]<<24 | Packet[7]<<16 | Packet[8]<<8 | Packet[9]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.