我想将一个结构转换为字节数组,然后再次取回字节并将其转换/广播到该结构。
这是一些假设的代码:
假设我们有一个struct foo
struct foo
{
int x;
float y;
} typedef foo;
假设我们已经分配了一些1000字节的内存,我希望能够将上述结构表示的字节放入我已经分配的1000字节中。
答案 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));
具有相同的效果。