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

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

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

用到的函数:

calloc();
malloc();
memcpy();
strcpy();
sprintf();将整形或者无符号整形格式化输入进入一个字符串。
atoi();字符串转int类型。
stat();等。
代码:
一:
#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;
}

二:

#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. 多使用参数化方式,接口化方式,有待改进。

posted @ 2017-07-28 14:40  bobojiang2016  阅读(451)  评论(0编辑  收藏  举报