zoukankan      html  css  js  c++  java
  • 通过缓冲传递数据-结构体

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

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

    用到的函数:

    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.
    ";
    
        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
    ",buf[2]);
        buf -= 39;
    
    
        printf ("%c
    ",buf[0]);
        printf ("head:%s",pack_head->pack_name);
        printf ("buf:%s
    ",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
    ",vv_2);
    
        pack_head_2 -> Version = &vv_2;
        printf("%s
    ",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 ", 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 ",pack_head_len); //int data_len = sizeof(src); memcpy (buff, &pack_head, pack_head_len); printf ("%s ",buff); printf ("buff..:%c ",buff[5]); PACK_HEAD pack_head_2; memcpy (&pack_head_2, buff, pack_head_len); //to struct 2 printf ("ph2.version:%d ", pack_head_2.version); printf ("ph2.dl:%d ", pack_head_2.data_len); printf ("ph2.pkname:%s ",pack_head_2.pack_name); return 0; }

    小结:

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

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

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

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

    种树最好的时间是十年前,其次是现在。
  • 相关阅读:
    条款04:确定对象在使用前已经被初始化
    条款06:若不想使用编译器自动生成的函数,就应该明确拒绝
    计算机操作系统之死锁的原因和必要条件
    条款10:令operator=返回一个reference to *this
    条款02:尽量以const,enum,inline代替#define
    条款11:在operator=处理自我赋值
    计算机操作系统之进程与线程
    堆排序
    NodeJS For Windows
    我常用的linux命令
  • 原文地址:https://www.cnblogs.com/bobojiang/p/7250126.html
Copyright © 2011-2022 走看看