将具有不同类型成员的结构复制到缓冲区

标签 c struct buffer memcpy

我有一个包含多个不同类型成员的结构。我想将此结构复制到缓冲区,然后连接一条消息供以后使用(将它们分开并读取结构和消息,我在这里没有这样做)。这是我的代码。

#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

我的问题是

  1. 是否需要将成员强制转换为相同类型才能将它们复制到缓冲区中?

  2. 为什么我已经声明了正确的源指针和它的长度,其余成员在缓冲区中消失了?

最佳答案

Header 的第一个成员 _magic_ 包含 7 个 char。您复制了 6 个 char(“ABCDEF”),后跟一个空字符。 strcat 在遇到第一个空字符时将源字符串复制到目标字符串中。因此,它会在 Header 的前六个字节之后立即附加“A random message”。如果要在整个结构之后附加消息,则需要指定要复制到的偏移量,如下所示。

strcpy(buffer + sizeof(Header), foo);

但是,它不会打印整个结构,因为空字符仍然紧跟在“ABCDEF”之后,即使 foo 已附加到正确的偏移量处。如果您想打印结构中的所有内容,只需显式打印出每个成员,就像这样。

printf("%s %c %u %u %hu %s",
    receiver_header._magic_,
    receiver_header._type[0],
    reveiver_header.no._ack_,
    receiver_header._length_,
    receiver_header._size_,
    foo);

关于将具有不同类型成员的结构复制到缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42729097/

相关文章:

python - 尝试提取json数据,获取期望的字符串或缓冲区

c - wait() 函数(在 LINUX 中)什么时候响应中断?

c - sscanf %s 其中字符串可以为空

c++ - 我如何在单独的头文件中的结构中定义一个 char* 数组?

c - 有没有办法为 C 中的结构创建 java 类变量?

c - 可靠地计算磁盘已满时 fwrite 写入的字节数

c - While 循环在条件出现之前停止

c - 如何使用ptrace附加进程中的所有线程

ios - 避免在 iOS 中重复取消引用

c++ - 为什么 cout 立即输出?