在 c++ 中解析数据包数据的最佳方法是什么?
What's the best way to parse a packet data in c++?
我正在将德尔福应用程序转码为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]
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 检测win32服务创建和删除的最佳方法
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 将线程中的数据存储到全局容器的最佳方法?
- 将一系列整数放入类的最佳方法是什么?
- 在派生类中使用基类的私有成员变量的最佳方法
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 比较两个节点坐标的最佳方法是什么?
- 在nodejs中使用本机代码的最佳方法是什么?
- 将 pybind11 绑定标记为已弃用的最佳方法
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- C++中变量混叠的最佳方法
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?