将整数转换为char数组,然后将其转换回

时间:2018-03-08 17:33:04

标签: c++ casting

我对于演员如何在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 

我在编译器上得到了正确的结果,但我想确定这是否是一种正确的方法。

1 个答案:

答案 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)
);

live demo

请注意,我只假装int是一堆char,而不是相反。

另请注意,我还将您的memcpy换成了类型安全的std::copy(尽管因为我们无论如何都会对这些类型进行核对,但这种情况还是类似于)。