前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通过缓冲传递数据-结构体

通过缓冲传递数据-结构体

作者头像
jianghaibobo
发布2019-09-11 16:36:46
4800
发布2019-09-11 16:36:46
举报

目的:申请一片缓冲,将结构体内容传递进入该缓冲再读取出来。

数据:结构体一成员为指针类型,结构体二成员为非指针类型。

用到的函数:

calloc();

malloc();

memcpy();

strcpy();

sprintf();将整形或者无符号整形格式化输入进入一个字符串。

atoi();字符串转int类型。

stat();等。

代码:

一:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFSIZE 1000
#pragma pack (push, 1) 
typedef struct Data_Package_Head
{
    
     unsigned short *Version;  
     unsigned int *data_len; 
     char *pack_name;
}PACK_HEAD;
#pragma pack (pop)


int main(int argc,char **argv)
{
    char *buf;
    PACK_HEAD *pack_head;
    char *src = "Add some words and a struct of Head.\n";

    buf = ( char *)calloc (BUFFSIZE, sizeof (char)); //char
    pack_head = (PACK_HEAD *)malloc (sizeof (PACK_HEAD));    
    pack_head -> pack_name = (char *)malloc (37); //convert to char
    pack_head -> Version = (unsigned short *)malloc (sizeof (unsigned short));
    pack_head -> data_len = (unsigned int *)malloc (sizeof (unsigned int)); 

    memcpy (pack_head->pack_name, src, 37);
    memcpy(buf, pack_head->pack_name, 37);
    buf += 37;
    unsigned short vv = 123;
    pack_head->Version = &vv;
    sprintf (buf, "%hu", *(pack_head->Version));//key! 3B in buf if vv is 123!
    buf += 2;
    unsigned int dl = 12345678; //Set 8 bits always.Now the mem are 47B.
    pack_head -> data_len = &dl;
    sprintf (buf, "%u", *(pack_head->data_len));
    printf ("dl3=%c\n",buf[2]);
    buf -= 39;


    printf ("%c\n",buf[0]);
    printf ("head:%s",pack_head->pack_name);
    printf ("buf:%s\n",buf);

    PACK_HEAD *pack_head_2;
    pack_head_2 = (PACK_HEAD *)malloc (sizeof (PACK_HEAD)); 
    pack_head_2 -> pack_name = (char *)malloc (37);   
    pack_head_2 -> Version = (unsigned short *)malloc (sizeof (unsigned short));

    memcpy(pack_head_2->pack_name, buf,37);
    
    unsigned short vv_2;
    //vv_2 = (((unsigned short)buf[37])-48)*10 + ((unsigned short)buf[38]-48);Y
    char tmp_Vrs[2];
    tmp_Vrs[0] = buf[37];
    tmp_Vrs[1] = buf[38];
    vv_2 = atoi (tmp_Vrs);
    printf ("vv_2=%hu\n",vv_2);

    pack_head_2 -> Version = &vv_2;
    printf("%s\n",pack_head_2->pack_name);
    printf ("ph_2_Vrs=%hu",*(pack_head_2 -> Version));

    free(buf);
    free(pack_head);
    free(pack_head_2);
    pack_head_2 = NULL;
    buf=NULL;
    pack_head=NULL;

    return 0;
}

二:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>


#define BUFFSIZE 1000
#define XXX_YYY_VERSION 0xff

#pragma pack (push, 1)
typedef struct Data_Package_Head
{
    int version;  
    int data_len; 
    char pack_name[128];
}PACK_HEAD;
#pragma pack (pop)


int main(int argc, char **argv)
{
    PACK_HEAD pack_head;
    char buff[BUFFSIZE] = {0};
  
  
  /*file stat*/
    struct stat buff_stat;
    int file_size;
    FILE *fd = fopen (argv[1], "rb");
    if (fd == NULL){
        perror ("fopen fail");
        exit (1);
    }else{
        if (stat (argv[1], &buff_stat) == -1){
            perror ("stat fail");
            exit (1);        
        }else
            file_size = buff_stat.st_size; //The size of the file.
    }
    printf ("fd_sz:%d\n", file_size);

    strcpy (pack_head.pack_name, "xxxxxxxxxxxxxxxxxxxxx.");
    pack_head.version = DSPPA_YIXIANTONG_VERSION;
    pack_head.data_len = file_size;
    int pack_head_len = sizeof(PACK_HEAD);
    printf ("head_len:%d\n",pack_head_len);
    //int data_len = sizeof(src);

    memcpy (buff, &pack_head, pack_head_len);
    printf ("%s\n",buff);
    printf ("buff..:%c\n",buff[5]);

    PACK_HEAD pack_head_2;
    memcpy (&pack_head_2, buff, pack_head_len); //to struct 2
    printf ("ph2.version:%d\n", pack_head_2.version);
    printf ("ph2.dl:%d\n", pack_head_2.data_len);
    printf ("ph2.pkname:%s\n",pack_head_2.pack_name);

    return 0;
}

小结:

01. 对c语言当中对内存的写入和管理有一定理解了;

02. 很多小细节,包括格式化输出、数据类型转化以及一些函数参数的理解。

03. 结构体字节对齐理解加深,包括以1字节对齐方法。

04. 多使用参数化方式,接口化方式,有待改进。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-07-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档