gpt4 book ai didi

c++ - 构建具有正确大小的结构元素

转载 作者:太空宇宙 更新时间:2023-11-04 11:23:55 25 4
gpt4 key购买 nike

我正在拦截一些数据包,然后将它们放入一个结构中。

#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 中包含的字符数。

我需要根据 TitleLenght 字节(十进制数)设置 RoomTitle 的大小。

如何修改结构以处理结构内正确位置的文本大小?

最佳答案

您应该执行如下操作,从您的套接字接收到的数据包中解析 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;
};

正如我在上面的代码注释中指出的

  1. 读取PacketHeader(注意SizeCRC 字节顺序!)
  2. 根据 PacketHeader::Size 从数据包中读取负载数据到另一个缓冲区。 (考虑检查 CRC)
  3. 相应地从负载数据中读取 TitleLengthRoomTitle。请注意,如果您想将 RoomTitle 数据作为 C 风格字符串处理,它实际上以 '\0' 结尾。在其他地方复制时也使用 TitleLength 信息。
  4. 读取已知大小的数据(再次注意字节顺序)

部分伪代码(未测试):

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++ - 构建具有正确大小的结构元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27345934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com