【发布时间】:2017-03-10 22:55:16
【问题描述】:
我有一个带有多个不同类型成员的结构。我想将此结构复制到缓冲区,然后连接一条消息以供以后使用(将它们分开并读取结构和消息,我在这里没有这样做)。这是我的代码。
#define DAT "d"
#define ACK "a"
#define SYN "s"
#define FIN "f"
#define RST "r"
typedef struct Headers { //total 20 bytes
unsigned char _magic_[7];
unsigned char _type_[1];
union {
unsigned int _seq_; //4 bytes
unsigned int _ack_; //4 bytes
} no;
unsigned int _length_; //4 bytes
unsigned short _size_; //2 bytes
} Header;
int main() {
Header receiver_header;
char buffer[1024];
strcpy(receiver_header._magic_, "ABCDEF");
strcpy(receiver_header._type_, DAT);
receiver_header.no._ack_ = 0;
receiver_header._length_ = 900;
receiver_header._size_ = 10240;
char foo[] = "A random message";
memcpy(buffer, &receiver_header, sizeof(Header));
strcat(buffer, foo);
printf("%s\n", buffer);
}
输出是
ABCDEFA random message
我的问题是
是否需要将成员强制转换为相同类型才能将它们复制到缓冲区中?
为什么我已经声明了正确的源指针和长度,缓冲区中的其余成员却消失了?
【问题讨论】:
-
即使假设您对
short和int的字节大小的所有假设都是正确的,并且该结构没有填充,您是如何计算20 个字节的?我数了18。 -
不要依赖于通信协议的实现细节。定义与机器无关的消息格式,并使用正确的编组和位移/屏蔽来序列化数据。其他任何事情都只会带来麻烦。你应该回顾一下 C 书籍中关于 C 字符串和数组的章节。另外:为什么要绕道使用宏来获取字符串文字?为什么不直接使用
const限定变量呢? -
@StoryTeller 它在填充之后,它发生在 _magic_[7] 和 _type_[1] 之后。它会在每种情况下填充 1 个字节,因此总共是 20 个字节。
-
@Olaf 感谢您的推荐,我会研究一下,看看我如何使用数据序列化,看看我是否可以做到这一点。我没有考虑使用
const,因为我不熟悉结构中的使用。我想将 struct 和 string 组合在一起的原因是为了让另一端(接收方或发送方)识别标头。它当然可以在所有字符串中完成,但我想让它更优雅,更易于使用。 -
我不建议对成员使用
const,而是使用原始字符串而不是宏。如果核心语言结构可以做得更好甚至更好,就不要使用宏!