我试图在c ++中按位方式将一些指向void *的对象(大小已知)转换为char数组。我正在考虑使用带有字符数组的联合,这样我就不必过多担心演员了。但是,由于对象的类型未知,我不知道如何定义此联合。
只是想知道是否还有其他更好的方法可以解决这个问题?
PS:编辑以避免混淆。例如,整数可以转换为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
}