rocklobster
rocklobster

Reputation: 619

Convert float vector to byte vector and back

I'm trying to do some conversions between float and unsigned char arrays (std::vector in this case) and i've run into some troubles.

I've converted the vector of floats to unsigned char like this...

vector<float> myFloats;
myFloats.push_back(1.0f);
myFloats.push_back(2.0f);
myFloats.push_back(3.0f);

const unsigned char* bytes = reinterpret_cast<const unsigned char*>(&floats[0]);

vector<unsigned char> byteVec;

for (int i = 0; i < 3; i++)
    byteVec.push_back(bytes[i]);

I'm hoping i've done this correctly, if not that would be the reason why the next part wont work.

// converting back somewhere later in the program
unsigned char* bytes = &(byteVec[0]);    // point to beginning of memory
float* floatArray = reinterpret_cast<float*>(*bytes);

for (int i = 0; i < 3; i++)
    cout << floatArray[i] << endl;  // error here

I've tried using (bytes) instead of (*bytes) in that last part but that prints the wrong values. Doing this also printed the wrong values

for (int i = 0; i < 3; i++)
    cout << (float)bytes[i] << endl;

Not sure how to get my original float values back from this.

Thanks for any help.

Upvotes: 4

Views: 9267

Answers (2)

rocklobster
rocklobster

Reputation: 619

Solved:

I think the problem was here

vector<unsigned char> byteVec;

for (int i = 0; i < 3; i++)
    byteVec.push_back(bytes[i]);

I removed that and replaced it with

vector<unsigned char> byteVec(bytes, bytes + sizeof(float) * myFloats.size());

then the rest works fine!

Also, remember to use (bytes) instead of (*bytes) here

float* floatArray = reinterpret_cast<float*>(bytes);

Upvotes: 6

mathematician1975
mathematician1975

Reputation: 21351

I have had to do this kind of thing for sending raw byte data over TCP. I used a struct that contains a single unsigned char[4] array and use memcpy to copy the bytes in my float values to the start of this array. It may not be ideal but it does work well enough for my purposes. Obviously you can do the reverse to retrieve the data.

Upvotes: 2

Related Questions