C将结构转换为字节数组,然后再次返回

时间:2019-01-15 00:06:18

标签: c memory memory-management

我想将一个结构转换为字节数组,然后再次取回字节并将其转换/广播到该结构。

这是一些假设的代码:

假设我们有一个struct foo

struct foo
{
  int x;
  float y;
} typedef foo;

假设我们已经分配了一些1000字节的内存,我希望能够将上述结构表示的字节放入我已经分配的1000字节中。

4 个答案:

答案 0 :(得分:4)

memcpy(ptrToAllocedMemory, &structOnStack, sizeof(structOnStack));怎么样?

答案 1 :(得分:2)

  

将结构也转换为字节数组...

通过union分配的简单对象。 foo的成员将与该分配一起复制,也许还有任何填充。 @Eric Postpischil

struct foo {
  int x;
  float y;
} typedef foo;

foo data_as_foo;

union x_foo {
  foo bar;
  unsigned char array_o_bytes[sizeof foo];
} x;

x.bar = data_as_foo;

// Do something with x.array_o_bytes
for (unsigned i = 0; i < sizeof x.array_o_bytes; i++) {
  printf("%2X ", x.array_o_bytes[i]);
}

甚至不需要分配

union x_foo = { .bar = data_as_foo );

对于不与foo对齐的 bytes 返回行程,重要的是使用memcpy()

foo bytes_to_foo(const unsigned char *data) {
  foo y;
  memcpy(&y, data, sizeof y);
  return y;
}

如果作为union x_foo的成员对齐字节,则分配就足够了。

union x_foo data_as_bytes;
// data_as_bytes.array_o_bytes populated somehow

foo data_as_foo = x_foo data_as_bytes.bar;

答案 2 :(得分:0)

C中的所有变量和结构都存储在内存中,并且内存已经是字节数组。

因此,与Java或C#相比,您不需要执行任何其他转换:

// to get struct's bytes just convert to pointer
struct foo tmp;
unsigned char* byte_array = (unsigned char*)&tmp;

// from bytes to struct
_Alignas(struct foo) unsigned char byte_array2[sizeof(struct foo)];
struct foo* tmp2 = (struct foo*)byte_array2;

正如人们指出的那样-从数组到结构的转换可能会在某些平台上导致UB,因此最好避免使用它,除非您分配了正确对齐的块

答案 3 :(得分:0)

您可以简单地指向该地址的指针,对其进行转换并从那里进行处理。

完整的代码片段演示了您的要求:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct foo
{
  int x;
  float y;
} typedef foo;

int main () {
        char *mem = malloc(1000); // preallocated memory as requested
        foo bar; // initial struct
        bar.x = 10; // initialize struct
        bar.y = 12;

        char *ptr =(char*)(&bar); //cast a char ptr to bar's address
        memcpy(mem, ptr, sizeof(foo)); // copy it over

        foo *result = (foo *)(mem); // cast the memory to a pointer to foo
        printf("%d, %f\n", result->x,result->y); // and it works!

        return 0;
}

如果您想投射指针并将其复制到一行中,也可以这样做

memcpy(mem,(char*)(&bar), sizeof(foo));

具有相同的效果。