我正在拦截一些数据包,然后将它们放入结构中。
#pragma pack(push, 1)
struct PacketHeader {
short Size;
short Checksum;
short Index;
};
#pragma pack(pop)
我有一个包含
PacketHeader
和其他一些字节的数据包,用于填充此结构:struct STRUCT_SVC_ROOM_CREATE {
PacketHeader Header;
unsigned char TitleLength; // 1 byte
char* RoomTitle[23];
short Unknow;
short Unknow2;
short Password1;
short Password2;
char LastByte;
};
在上面的结构中,TitleLength是一个字节,十进制可以为0x17(23)或任何数字。此数字包含在RoomTitle中的字符数。
我需要将
RoomTitle
accortng的大小设置为TitleLenght
字节(作为十进制数字)。如何修改结构以在结构内的正确位置处理文本大小?
最佳答案
您应该执行以下操作,以从套接字接收的数据包中解析RoomTitle
:
struct STRUCT_SVC_ROOM_CREATE {
PacketHeader Header; // Header length is sizeof(PacketHeader)
unsigned char TitleLength; // 1 byte
char RoomTitle[255]; // I suspect you don't have 23 `RoomTitle[23];` char*
// pointers at this point, but just a char* maximally
// sized as the maximum number that TitleLength can hold
// (which is 255).
short Unknow; // Unknow length is sizeof(short)
short Unknow2; // ... ditto aso.
short Password1;
short Password2;
char LastByte;
};
正如我在上面的代码注释中指出的那样
PacketHeader
(注意Size
和CRC
的字节序!)PacketHeader::Size
将有效载荷数据从数据包读取到另一个缓冲区中。 (考虑检查CRC)TitleLength
和RoomTitle
。请注意,如果您想将RoomTitle
数据作为c样式的字符串来处理,则它实际上以'\0'
终止。在其他地方复制时,也请使用TitleLength
信息。 一些伪代码(未经测试):
int recv_ROOM_CREATE_packet(int sockfd, STRUCT_SVC_ROOM_CREATE* packet) {
read(sockfd,&(packet->Header),sizeof(PacketHeader));
read(sockfd,&(packet->TitleLength),sizeof(unsigned char));
read(sockfd,packet->RoomTitle,packet->TitleLength);
// ensure that packet->RoomTitle is a correctly terminated c-style string
if(packet->TitleLength < 255) {
packet->RoomTitle[packet->TitleLength + 1] = `\0`;
}
else {
packet->RoomTitle[254] = `\0`;
}
// aso ...
}
关于c++ - 用正确的大小构建struct元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27345934/