我是C++
编程的新手。我正在尝试创建一个与Camera
通信的软件。我能够与Camera
交流Software
。
通过WireShark,我可以看到相机正在向我发送packet
的{{1}}。
我想将该数据包存储在结构中。
例如:-
我收到的包裹是
hex representation
每个值均为 char packet_bytes[] = {
0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x10,
};
我想在此1 byte
我的代码存储在Struct中
struct
数据包大小为22,所以我这样存储值,我知道这是错误的。
示例
如果2个字节为m_receivedBytes = recvfrom(sock, (char*)m_packetBuffer, sizeof(m_packetBuffer), 0, (sockaddr*)&cameraInfo, &m_socketLength);
if (m_receivedBytes > 0)
{
switch (m_protocolType)
{
case StreamProtocol: ProtocolStruct.m_status = m_packetBuffer[0] + m_packetBuffer[1];
ProtocolStruct.m_blockID = m_packetBuffer[2] + m_packetBuffer[3];
ProtocolStruct.m_format = m_packetBuffer[4];
ProtocolStruct.m_packetID = m_packetBuffer[5] + m_packetBuffer[6] + m_packetBuffer[7];
switch (ProtocolStruct.m_format)
{
case 1: ProtocolStruct.m_leader->m_fieldInfo = m_packetBuffer[9];
ProtocolStruct.m_leader->m_payloadType = m_packetBuffer[10] + m_packetBuffer[11];
break;
default:
break;
}
break;
default:
break;
}
,则当我使用10 01
运算符时,结果为+
,这是不正确的。正确的答案应为11
。
所以任何人都可以告诉我如何将所有数据放入Structure
答案 0 :(得分:1)
在处理电信数据包时,必须确保两个对等方共享相同的确切字节布局和顺序。 你的问题是结构定义是编译器特定的;一种快速而肮脏的方法是使用“打包”布局:
struct __attribute__((__packed__)) ProtocolStruct
{
__int16 m_status;
__int16 m_blockID;
__int8 m_format;
__int32 m_packetID;
struct Trailer *m_trailer;
}ProtocolStruct;
这解决了布局问题,但解决了字节顺序问题,也解决了字节序问题。
但是并不总是足够见Is gcc's __attribute__((packed)) / #pragma pack unsafe?