目的:申请一片缓冲,将结构体内容传递进入该缓冲再读取出来。
数据:结构体一成员为指针类型,结构体二成员为非指针类型。
用到的函数:
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. 多使用参数化方式,接口化方式,有待改进。