在C ++中从字节数组中检索整数的最佳方法是什么

时间:2014-11-17 02:28:16

标签: c++ arrays byte

现在我正在以这种方式将int转换为字节数组:

int num = 16777215;
char* bytes = static_cast<char*>(static_cast<void*>(&num));

这是最好的方法吗?

另外,如何从该数组中检索int值?

2 个答案:

答案 0 :(得分:1)

如果你想要字节,你使用错误的演员:

char* bytes = reinterpret_cast<char*>(&num);

相反的方式:

int num = *reinterpret_cast<int*>(bytes);

请注意,通常您无法执行此操作,char很特殊,因此您可能需要查找别名。

答案 1 :(得分:1)

回应

  

有没有办法将它直接投射到矢量?

你可以这样做:

#include <vector>
#include <cstdint>

template <class T>
std::vector<uint8_t> toByteVector(T value)
{
    std::vector<uint8_t> vec = (std::vector<uint8_t>
                                (reinterpret_cast<uint8_t*>(&value),
                                (reinterpret_cast<uint8_t*>(&value))+sizeof(T))
                                );
    dumpBytes<T>(vec);

    return vec; // RVO to the rescue
}

// just for dumping:
#include <iostream>
#include <typeinfo>
#include <iomanip>

template <class T>
void dumpBytes(const std::vector<uint8_t>& vec)
{
    std::cout << typeid(T).name() << ":\n";
    for (auto b : vec){
        // boost::format is so much better for formatted output.
        // Even a printf statement looks better!
        std::cout << std::hex << std::setfill('0') << std::setw(2)
                  << static_cast<int>(b) << " "
                   ; 
    }
    std::cout << std::endl;
}

int main()
{
    uint16_t n16 = 0xABCD;
    uint32_t n32 = 0x12345678;
    uint64_t n64 = 0x0102030405060708;

    toByteVector(n16);
    toByteVector(n32);
    toByteVector(n64);

    return 0;
}