简体   繁体   中英

What is the best way to retreieve an integer from a byte array in C++

Right now I am converting an int to a bytes array this way:

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

Is this the best way to do it?

Also, how can I retrieve the int value from that array?

If you want the bytes, you are using the wrong cast:

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

Same for the other way around:

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

Note that in general you can't do this, char is special, so you might want to look up aliasing.

In response to

Is there any way to cast it directly to a vector?

You could do something like this:

#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;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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