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

#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(注意SizeCRC的字节序!)
  • 根据PacketHeader::Size将有效载荷数据从数据包读取到另一个缓冲区中。 (考虑检查CRC)
  • 相应地从有效载荷数据中读取TitleLengthRoomTitle。请注意,如果您想将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/

    10-10 00:01