设为首页 加入收藏

TOP

结构体自动化转为char数组(一)
2014-04-06 17:36:02 来源: 作者: 【 】 浏览:334
Tags:结构 自动化 转为 char 数组

  结构体自动化转换为char数组这个需求,来自于一个最近开发的一个项目,在项目开发过程中遇到一个小问题,需要将各种结构体拷贝到char数组中,这对于一个简单的结构体来说是很简单的事情,比如下面这个只有整形字段的结构体:

  struct A

  {

  int a;

  int b;

  };

  char buf[100];

  A a = {1,2};

  memcpy(buf, &a, sizeof(A));

  一句memcpy就能将结构体a拷贝到char数组中去了,直接通过memcpy拷贝结构体只对于内存连续的结构体有效。如果结构体内存不连续,结构体中含有double、string、指针甚至嵌套结构体时,直接拷贝是错误的,这时需要一个一个字段的转换,比如下面的结构体:

  struct A

  {

  int x;

  string y;

  };

  char buf[100];

  A a = {1, "test"};

  char* p = buf;

  *((int*)p) = x;

  p+=sizeof(int);

  strcpy(p, t.c_str());

  可以看到这种一个一个字段转换的方法是很繁琐的,字段越多转换就越繁琐,而且偏移量还容易写错。当结构体字段是指针或者结构体时就更繁琐了,比如下面的结构体:

  struct A

  {

  int x;

  int y;

  };

  struct B

  {

  int x;

  int count; //标示指针p中的元素个数

  int *p;

  A a;

  };

  char buf[100];

  B b = {1, 2, new int {3, 4}, {2, 3}};

  char* p = buf;

  *((int*)p) = b.x;

  p+=sizeof(int);

  *((int*)p) = b.count;

  p+=sizeof(int);

  for(int i=0; i

  {

  *((int*)p) = b.p[i];

  }

  p+=sizeof(int)*b.count;

  *((int*)p) = b.a.x;

  p+=sizeof(int);

  *((int*)p) = b.a.y;

  可以看到这种带指针或者嵌套结构体的结构体转换为char数组时非常繁琐,而且很容易出错,其实大部分的工作都是重复的,比如不断的赋值与偏移。这个过程如果能做到自动化就很方便了,直接传一个结构体,然后自动将结构体中的字段一个一个拷贝到数组中,不必关心偏移是否出错了,也不用关心内部的字符串或者嵌套结构体如何拷贝等细节,总之 ,只要传一个结构体就能自动化的将其转换为char数组。

     

首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++非类型模板参数 下一篇关于构造函数c++

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·在 Redis 中如何查看 (2025-12-26 03:19:03)
·Redis在实际应用中, (2025-12-26 03:19:01)
·Redis配置中`require (2025-12-26 03:18:58)
·Asus Armoury Crate (2025-12-26 02:52:33)
·WindowsFX (LinuxFX) (2025-12-26 02:52:30)