简体   繁体   中英

Converting an integer to an hexadecimal unsigned char array in C++

I need to convert an integer int parameter to an hexadecimal unsigned char buffer[n] . If integer is for example 10 then the hexadecimal unsigned char array should be 0x0A

To do so I have the following code:

int parameter;
std::stringstream ss;
unsigned char buffer[];

ss << std::hex << std::showbase << parameter;
typedef unsigned char byte_t;

byte_t b = static_cast<byte_t>(ss); //ERROR: invalid static_cast from type ‘std::stringstream {aka std::basic_stringstream<char>}’ to type ‘byte_t {aka unsigned char}’

buffer[0]=b;

Does anyone know how to avoid this error? If there is a way of converting the integer parameter into an hexadecimal unsigned char than doing first: ss << std::hex << std::showbase << parameter; that would be even better.

Consulting my psychic powers it reads you actually want to have a int value seen in it's representation of bytes ( byte_t ). Well, as from your comment

I want the same number represented in hexadecimal and assigned to a unsigned char buffer[n].

not so much psychic powers, but you should note hexadecimal representation is a matter of formatting, not internal integer number representation.

The easiest way is to use a union like

union Int32Bytes { 
    int ival; 
    byte_t bytes[sizeof(int)]; 
};

and use it like

Int32Bytes x;
x.ival = parameter;

for(size_t i = 0; i < sizeof(int); ++i) {
    std::cout << std::hex << std::showbase << (int)x.bytes[i] << ' ';
}

Be aware to see unexpected results due to endianess specialities of your current CPU architecture.

Problem 1: buffer is of undetermined size in your snippet. I'll suppose that you have declared it with a sufficient size.

Problem 2: the result of your conversion will be several chars (at least 3 due to the 0x prefix). So you need to copy all of them. This won't work with an = unless you'd have strings.

Problem 3: your intermediary cast won't succeed: you can't hope to convert a complex stringstream object to a single unsigned char. Fortunately, you don't need this.

Here a possible solution using std::copy() , and adding a null terminator to the buffer:

const string& s = ss.str();
*copy(s.cbegin(), s.cend(), buffer)='\0'; 

Live demo

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