簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM