我一直在调试我的代码已经有一段时间了,我需要一个健全性检查,reinterpret_cast不是问题。我用了C / C ++已经有一段时间了,我可能会忘记基础知识。
在我的函数中,我获得了一些通用数据void *data
从传入的其他参数中,我知道数据的大小以及某些类型被偏移的位置。例如,data
的大小为12个字节:前4个字节为int,后4个字节为字符,后4个字节为int。
问题:
我如何从数据中获取每个数据的和平(int,char,char,char,char,int)?到目前为止,我一直在使用reinterpret_cast
并且它有效!但是,这样的实例可以出现在我的值(memFirst4,memA,memB等)不是我预期的地方,因为我正在使用reinterpret_cast吗?
void *data = malloc((sizeof(int)*3)); // 12 bytes .. my compiler has ints as 4 bytes
int first4 = 8075;
char a = 'a';
char b = 'b';
char c = 'c';
char d = 'd';
int last4 = 981;
memcpy(data,&first4,sizeof(int)); // copy first4 into memory
memcpy(data+sizeof(int)+sizeof(char)*1,&a,sizeof(char)); // copy char a into memory
memcpy(data+sizeof(int)+sizeof(char)*2,&b,sizeof(char)); // copy char b into memory
memcpy(data+sizeof(int)+sizeof(char)*3,&c,sizeof(char)); // copy char c into memory
memcpy(data+sizeof(int)+sizeof(char)*4,&d,sizeof(char)); // copy char d into memory
memcpy(data+sizeof(int)+sizeof(char)*4+sizeof(int),&last4,sizeof(int)); // copy last4 into memory
int memFirst4 = *reinterpret_cast<int *>(data);
char memA = *reinterpret_cast<char *>(data+sizeof(int)+sizeof(char)*1);
char memB = *reinterpret_cast<char *>(data+sizeof(int)+sizeof(char)*2);
char memC = *reinterpret_cast<char *>(data+sizeof(int)+sizeof(char)*3);
char memD = *reinterpret_cast<char *>(data+sizeof(int)+sizeof(char)*4);
int memLast4 = *reinterpret_cast<int *>(data+sizeof(int)+sizeof(char)*4+sizeof(int));
free(data);
答案 0 :(得分:1)
您的解决方案可行,但风险很大(容易出错,复制一个字节或更少)。因此,我会建议工会:
#pragma pack(1)
union myData
{
char data[12];
struct fields
{
uint8_t i[4];
char c[4];
uint8_t i2[4];
} u_fields;
}
#pragma pack(pop)
Union允许您读取与不同类型相同的内存块(在本例中使用char [12]数据和字段struct)。
答案 1 :(得分:0)
你不应该使用reinterpret_cast。使用reinterpret_cast不允许使用来自void *的一些指针。
如果要从void *转换为其他内容,可以使用static_cast。但请记住,在两者之间使用void *从一种类型转换为另一种类型(不同)类型将产生一个未指定的指针值。