Nick
Nick

Reputation: 29

Convert a 16-bit integer to an array of char? (C++)

I need to write 16-bit integers to a file. fstream only writes characters. Thus I need to convert the integers to char - the actual integer, not the character representing the integer (i.e. 0 should be 0x00, not 0x30) I tried the following:

char * chararray = (char*)(&the_int);

However this creates a backwards array of two characters. The individual characters are not flipped, but the order of the characters is. Thus I created this function:

   char * inttochar(uint16_t input)
{
    int input_size = sizeof(input);
    char * chararray = (char*)(&input);
    char * output;
    output[0]='\0';
    for (int i=0; i<input_size; i++)
    {
        output[i]=chararray[input_size-(i+1)];
    }
    return output;
}

This seems slow. Surely there is a more efficient, less hacky way to convert it?

Upvotes: 2

Views: 2383

Answers (1)

Ami Tavory
Ami Tavory

Reputation: 76297

It's a bit hard to understand what you're asking here (perhaps it's just me, although I gather the commentators thought so too).

You write

fstream only writes characters

That's true, but doesn't necessarily mean you need to create a character array explicitly.

E.g., if you have an fstream object f (opened in binary mode), you can use the write method:

uint16_t s;
...
f.write(static_cast<const char *>(&s), sizeof(uint16_t));

As others have noted, when you serialize numbers, it often pays to use a commonly-accepted ordering. Hence, use htons (refer to the documentation for your OS's library):

uint16_t s;
...
const uint16_t ns = htons(s);
f.write(static_cast<const char *>(&ns), sizeof(uint16_t));

Upvotes: 2

Related Questions