将(void *)指向的对象转换为char []

时间:2016-02-19 21:49:28

标签: c++ casting

我试图在c ++中按位方式将一些指向void *的对象(大小已知)转换为char数组。我正在考虑使用带有字符数组的联合,这样我就不必过多担心演员了。但是,由于对象的类型未知,我不知道如何定义此联合。

只是想知道是否还有其他更好的方法可以解决这个问题?

PS:编辑以避免混淆。例如,整数可以转换为4个字符的数组。

谢谢!

4 个答案:

答案 0 :(得分:3)

在我在评论中添加的链接中,接受的答案详细介绍了类型惩罚以及为什么不能用c ++进行此操作。

您可以使用char*安全地检查reinterpret_cast(已签名或未签名)的任何对象。

char* ptr = reinterpret_cast<char*>(&object);
for (std::size_t x = 0; x < sizeof(object); ++x)
    std::cout << ptr[x]; //Or something less slow but this is an example

如果您想将对象实际移动到char[],则应使用std::memcpy

答案 1 :(得分:1)

如果您不担心额外的内存,可以使用memcpy

int i = 10;
char carray[sizeof(i)];
memcpy(carray, &i, sizeof(i));

但是,请记住carray不会是一个以空字符结尾的字符串。它只是一个char的数组。最好使用unsigned char,因为如果char是您平台上的签名类型,那么其中一个字节中的值可能对char而言太大。

int i = 10;
unsigned char carray[sizeof(i)];
memcpy(carray, &i, sizeof(i));

答案 2 :(得分:0)

为什么你觉得你需要担心演员?

只需reinterpret_cast指向char*的void指针,并迭代每个字符,直到原始对象的大小。请记住,char*指针不是以空字符结尾的字符串,并且可能在数据中间包含或不包含空字符,因此不要像C字符串那样处理它。

答案 3 :(得分:0)

从5.2.10重新解释演员:

  

可以将对象指针显式转换为不同类型的对象指针。当一个prvalue   如果T1和T2都是标准布局类型(3.9)并且对齐,则将“指向T1的指针”的类型转换为“指向cv T2的指针”类型,结果为static_cast(static_cast(v))   T2的要求不比T1严格,或者任何一种类型无效。

所以你只想使用:

char* my_bytes = reinterpret_cast<char*>(my_pointer); 
size_t num_bytes = sizeof(my_pointer);
for(size_t i = 0; i < num_bytes; ++i) {
   // *(my_bytes + i) has the most significant to least significant bytes
}