将长整数转换为字符数组的最安全的方法是什么

时间:2013-11-06 04:54:04

标签: c++ arrays c++11 casting reinterpret-cast

现在我有了这段代码:

uint64_t buffer = 0;
const uint8_t * data = reinterpret_cast<uint8_t*>(&buffer);

这样可行,但由于悬挂指针(看起来很难看)似乎有风险。我不想坐在那里的裸指针。我想做这样的事情:

uint64_t buffer = 0;
const std::array<uint8_t, 8> data = partition_me_softly(buffer);

是否有和c ++ 11样式构造允许我将其放入一个安全的容器中,最好是std::array这样的unsigned int而不会产生开销?

如果没有,那么改善此代码以获得更安全的理想方法是什么?


所以我修改了dauphic的答案,使其更具通用性:

template <typename T, typename U>
std::array<T, sizeof(U) / sizeof(T)> ScalarToByteArray(const U v)
{
    static_assert(std::is_integral<T>::value && std::is_integral<U>::value, 
        "Template parameter must be a scalar type");
    std::array<T, sizeof(U) / sizeof(T)> ret;
    std::copy((T*)&v, ((T*)&v) + sizeof(U), ret.begin());
    return ret;
}

通过这种方式,您可以将其用于更多类型:

uint64_t buffer = 0;
ScalarToByteArray<uint8_t>(buffer);

1 个答案:

答案 0 :(得分:5)

如果要在字节数组中存储整数,最好的方法可能是将整数转换为uint8_t*并将其复制到std::array。您将不得不在某些时候使用原始指针,因此您最好的选择是将操作封装到函数中。

template<typename T>
std::array<uint8_t, sizeof(T)> ScalarToByteArray(const T value)
{
    static_assert(std::is_integral<T>::value, 
        "Template parameter must be a scalar type");
    std::array<uint8_t, sizeof(T)> result;
    std::copy((uint8_t*)&value, ((uint8_t*)&value) + sizeof(T), result.begin());
    return result;
}