我对于演员如何在C ++中工作有点困惑 我有一个4字节的整数,我需要将其转换为char [32],然后将其转换回其他函数。
我正在做以下事情:
uint32_t v = 100;
char ch[32]; // This is 32 bytes reserved memory
memcpy(ch,&v,4);
uint32_t w = *(reinterpret_cast<int*>(ch)); // w should be equal to v
我在编译器上得到了正确的结果,但我想确定这是否是一种正确的方法。
答案 0 :(得分:3)
从技术上讲,没有。如果CPU的对齐规则有任何错误,你就有可能犯规。
您可以使用char*
逐个字节地对一个对象进行别名,但是您无法获取实际的char
数组(无论其值来自何处)并假装它#39 ; s其他一些对象。
您将看到很多reinterpret_cast<int*>
方法,并且在许多系统上它似乎都能正常工作。然而,&#34;适当的&#34;方法(如果你真的需要这样做)是:
const auto INT_SIZE = sizeof(int);
char ch[INT_SIZE] = {};
// Convert to char array
const int x = 100;
std::copy(
reinterpret_cast<const char*>(&x),
reinterpret_cast<const char*>(&x) + INT_SIZE,
&ch[0]
);
// Convert back again
int y = 0;
std::copy(
&ch[0],
&ch[0] + INT_SIZE,
reinterpret_cast<char*>(&y)
);
请注意,我只假装int
是一堆char
,而不是相反。
另请注意,我还将您的memcpy
换成了类型安全的std::copy
(尽管因为我们无论如何都会对这些类型进行核对,但这种情况还是类似于)。