代码之家  ›  专栏  ›  技术社区  ›  Bernie Perez

如何将c中的字符[]复制到我的结构中

  •  0
  • Bernie Perez  · 技术社区  · 16 年前

    结构包{ int-seqnum; 字符数据[BUFFERSIZE];

    bytes = sizeof(packet);
    char sending[bytes];
    bzero(sending, bytes);
    memcpy((void *) sending, (void *) &packet, sizeof(bytes));
    bytes = sendto(sockfd, sending, sizeof(sending), 0,
        (struct sockaddr *) &client, clientSize);
    

    所以我希望将我的结构复制到Char[]。

    int bytes;
    bytes = sizeof(struct Packet);
    char recv[bytes];
    bytes = recvfrom(sockfd, recv, bytes, 0,
        (struct sockaddr *) &client, &clientSize);
    memcpy((void *) currentpkt, (void *) recv, bytes);
    

    但是在接收器上 memcpy((void*)currentpkt,(void*)recv,字节);

    错误:无法转换为指针类型

    *****更新*****

    谢谢大家的回答。最后,我错过了“和”但是我的代码现在看起来像这样。

    void udt_send(struct Packet packet) {
        int bytes;
        bytes = sendto(sockfd, (char *) &packet, sizeof(packet), 0,
                (struct sockaddr *) &client, clientSize);
    }
    

    接收人:

    bytes = recvfrom(sockfd, (char *) &currentpkt, bytes, 0,
            (struct sockaddr *) &client, &clientSize);
    

    在C语言中,我们可以把它转换成一个字符,然后发送字节。

    4 回复  |  直到 16 年前
        1
  •  3
  •   James McNellis    16 年前

    currentpkt 为结构型;您需要获取指向结构的指针才能使其正常工作:

    memcpy(&currentpkt, recv, bytes);
    

    sizeof(struct Packet) ? 正如现在所写的,您将溢出您的结构。

    如果客户机和服务器应用程序使用不同的编译器或设置进行编译,或者在具有不同endianness的平台上进行编译,该怎么办?在这种情况下,两个平台上的结构可能大小不同,在内存中的布局也可能不同。

        2
  •  1
  •   DigitalRoss    16 年前

    currentpkt struct Packet 你真的想说 &currentpkt .

    我可能还注意到 memcpy() 已经有 void * 参数,所以 (void *) 不需要石膏。

        3
  •  0
  •   Seth    16 年前

    memcpy((void *) currentpkt, (void *) recv, bytes);

    您的错误消息表明存在强制转换问题。 recv 因为这是一个 char[] (转换为(void*)没有问题)。问题一定是 currentpkt

    它没有在你的代码片段中声明,所以我不知道它是什么,但我从这里开始。

        4
  •  0
  •   Henrik    16 年前

    从整个结构中执行memcpy确实是邪恶的:-)。首先,根据体系结构的不同,数据可能会有不同的对齐方式。如果另一边的架构不同呢?此外,使用诸如_packed之类的关键字在不同的编译器之间是不可移植的。

    据我所知,最好的方法是使用像PHP包/解包这样的API。这使得代码真正具有可移植性,而无需使用特定于编译器的丑陋关键字,如u-packed。

    我在网上没有找到任何C的打包/解包,所以我自己写了。

       pbuf_unpack(p_bts, "ww", &hdr, &ver); 
    

    哪里

       p_bts is binary data
       "ww" describes the data structure
       hdr and ver is where to put the datause an API like the PHP pack/unpack. 
    

    另一个更广泛的例子:

       pbuf_unpack(p_entry, "bbbbbbbbww",
          &atrb_mbr.def_boot_par, &atrb_mbr.head_start, &atrb_mbr.sec_start,
          &atrb_mbr.cyl_start, &atrb_mbr.type, &atrb_mbr.head_end, 
          &atrb_mbr.sec_end, &atrb_mbr.cyl_end, &atrb_mbr.start_sec_pbr,
          &atrb_mbr.sec_per_par);
    

    包装非常简单:

       pbuf_pack(boot_buf, "sdsdhbhbhhbhhhwwbbbwsdsd", sizeof(fat_jmp_boot_t), 
          boot.jmp, sizeof(fat_oem_nm_t), boot.oem_nm, boot.n_bps, boot.n_spc, 
          boot.n_rs, boot.n_fs, boot.n_rde, boot.n_ts16, boot.media_des, 
          boot.n_fatsz16, boot.n_spt, boot.n_hds, boot.n_hs, boot.n_ts32, 
          boot.drv_no, boot.rsrvd1, boot.boot_sig, boot.vol_id, 
          sizeof(fat_vol_lbl_t), boot.lbl, sizeof(fat_vol_type_t), boot.type);
    

    它不仅创建了可移植的代码,而且非常漂亮;)

    推荐文章