繁体   English   中英

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

[英]Cast the object pointed by (void*) to char[]

我正在尝试将void *指向的某些对象(大小已知)在c ++中按位投射到char数组。 我正在考虑将联合与char数组一起使用,这样我就不必担心转换。 但是,由于对象的类型未知,因此我不知道如何定义此联合。

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

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

谢谢!

在我发表评论的链接中,可接受的答案详细介绍了类型校正和为什么不能在c ++中做到这一点。

您可以做的就是通过使用reinterpret_cast安全检查带有char* (带符号或无符号)的任何对象。

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

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

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

但是,请记住, carray不会是一个以null结尾的字符串。 这将只是一个char数组。 最好使用unsigned char因为如果char是平台上的带符号类型,则其中一个字节中的值对于char可能太大。

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

为什么您觉得需要担心铸造?

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

从5.2.10重新解释演员表:

可以将对象指针显式转换为其他类型的对象指针。 当将“指向T1的指针”的prvalue v转换为“指向T2的指针”时,如果T1和T2均为标准布局类型(3.9)且需要对齐,则结果为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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM