将struct复制到缓冲区

我有一个结构:

struct data{
 int num1;
 int num2;
 int num3;
 int num4;
}

现在,我可以转换单个元素,然后将它们放在缓冲区中,但我想将整个结构复制到缓冲区(char buffer [sizeof(data)]).

有没有办法复制?

在你对 this answer的评论中,

I am trying to copy this struct to a flash [memory chip]. And the Flash read/write API passes a string. – Punit 2 hours ago

你揭示了你有一个XY Problem – 你问的是如何实现你的解决方案的想法,而不是如何解决你的问题.您真的不想将结构复制到缓冲区,您希望使用需要char *参数的API将结构中的数据写入Flash.

其他人指出,memcpy会做你想要的.但它们都涉及在RAM中为此缓冲区分配内存.使用这些方法会起作用,但它们会浪费时间和记忆.假设您的Flash API具有以下功能:

int WriteBlock(int address, char *data, int length);

并且您已将结构存储在名为data_var的变量中,您可以使用与memcpy相同的API:

int success = WriteBlock(my_address, (char *) &data_var, sizeof(struct data)

为了更清楚并避免演员表演,你可能希望将它包装在一个联盟中:

union {
    struct data{
        int num1;
        int num2;
        int num3;
        int num4;
    };
    char data_arr[sizeof(struct data)];
};

这将允许您使用更传统的语法来调用它.

请注意,如果您有一个非连续的结构,两个方法(和memcpy!)都可能会失败.例如,您的结构可能如下所示:

struct data{
 int   num1;
 char  num2;
 long  num3;
 short num4;
}

如果你使用的不是8位系统,那么这种结构很可能(取决于你的架构)来控制间隙.
例如,假设num1为0x12345678,num2为0x9A,num3为0xBCDEF0123456789A,num4为0xBCDE,则可能具有以下任意值(假设您的内存为零初始化,并且为了清晰起见为big-endian):

    /* 8-bit */
    0x1234 5678 9ABC DEF0 1234 5678 9ABC DE00
    /* 16-bit */
    0x1234 5678 009A BCDE F012 3456 789A BCDE
    /* 32-bit */
    0x1234 5678 0000 0000 0000 009A BCDE F012 3456 789A 0000 0000 0000 BCDE

在这种情况下,你将不得不使用更丑陋的东西,如下面的函数:

int fillDataBuffer(struct data d, char *buffer, int len) 
{
  int i, j = 0;

  for (i = sizeof(d.num1) - 1; i >= 0 && j < len; i--, j++) {
    buffer[j] = (char) (d.num1 >> i); 
  }
  for (i = sizeof(d.num2) - 1; i >= 0 && j < len; i--, j++) {
    buffer[j] = (char) (d.num2 >> i); 
  }
  for (i = sizeof(d.num3) - 1; i >= 0 && j < len; i--, j++) {
    buffer[j] = (char) (d.num3 >> i); 
  }
  for (i = sizeof(d.num4) - 1; i >= 0 && j < len; i--, j++) {
    buffer[j] = (char) (d.num4 >> i); 
  }

  if (j >= len) {
    /* Error!  The buffer wasn't big enough. */
    return 0;
  } else {
    return 1;
  }
}

或#pragma pack()宏,但这可能使结构使用较慢的计算,而你可能宁愿打包它,当你要进行缓冲.

相关文章
相关标签/搜索