我在网上找不到任何告诉如何将数据类型放入预先分配的内存块的内容。我讨厌自己做内存管理,但在这种情况下我必须。
我有一块10字节长的内存。 (我的应用程序使用Visual C是64位。)我想要做的是将1个unsigned int放入字节0-3,将char放入[4]并将char放入[5],将另一个unsigned int放入[6- 9]。
我已经尝试过ssprintf了。
所以我试图找出一种方法来1)将它存储到这个内存块中并且2)检索它。
答案 0 :(得分:3)
IMO,实现这一目标的一个好方法是定义一个包含你所描述数据的结构:
#pragma pack(1)
struct complex {
uint32_t a; // 4 bytes
char b[2]; // 2 bytes (without paddding)
uint32_t c; // 4 bytes
};
然后您只需填写您的数据:
struct complex var;
var.a = 10;
var.b[0] = 'x';
var.b[1] = 'y';
var.c = 20;
注意#pragma pack(1)
指令告诉编译器使用1字节对齐。如果您不知道这意味着什么,可以阅读data structure alignment。
答案 1 :(得分:2)
如果使用struct
不是一个选项,则以下内容适用于将数据加载到内存块中。只需反过来获取数据:
// char *mem = <10_bytes>;
unsigned int x = 54;
unsigned int y = 10;
memmove(mem, &x, 4);
memset(mem + 4, 'A', 1);
memset(mem + 5, 'B', 1);
memmove(mem + 6, &y, 4);
答案 2 :(得分:2)
您正在处理字节(并且您不存储类型,只是将数据存储在其中)。您可以声明struct
以满足您的要求,也可以将数据的字节(例如memcpy
)复制到适当的位置,例如
unsigned int lastint;
char* buf;
memcpy (&lastint, buf+6, sizeof(lastint));
但是,请注意,处理此类低级二进制数据会使数据和应用程序极不可移植(并且很脆弱,因为它会在应用程序发展时中断)。存在更多“标准”二进制格式(例如XDR或ASN1)。
答案 3 :(得分:1)
您可以使用此结构:
#pragma pack(1)
struct TData {
unsigned int a;
char c1;
char c2;
unsigned int b;
};
然后,在你的功能上:
int f()
{
char buffer[10]; // your 10
struct TData *data = (struct TData*)buffer;
printf("a: %d b: %b c1: %c c2: %c", data->a, data->b, data->c1, data->c2);
}
答案 4 :(得分:0)
使用“struct”
(可选)使用特定于编译器的“pack”指令,以确保编译器不会“填充”任何字段。
(可选)使用“memset”(或等效物)将块清零
一次复制数据
PS: Microsoft MSVC和Gnu Gcc都使用“#pragma pack(1)”来防止填充。