Преобразовать вектор с плавающей точкой в вектор байтов и обратно

Я пытаюсь выполнить некоторые преобразования между массивами с плавающей точкой и без знака (в данном случае std :: vector), и у меня возникли некоторые проблемы.

Я преобразовал вектор с плавающей точкой в неподписанный символ следующим образом ...

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]);

Я надеюсь, что я сделал это правильно, если нет, то это будет причиной того, что следующая часть не будет работать.

// 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

Я пытался использовать (байты) вместо (* байтов) в этой последней части, но это печатает неправильные значения. При этом также печатались неправильные значения

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

Не уверен, как вернуть мои первоначальные значения с плавающей точкой из этого.

Спасибо за любую помощь.

 R. Martinho Fernandes13 июн. 2012 г., 21:37
reinterpret_cast<float*>(bytes); (обратите внимание, что в паренсе нет звезды).
 rocklobster13 июн. 2012 г., 21:39
Я заявил в своем посте, что попробовал это. Первое значение, которое я распечатал, используя (в байтах), было -2.1267e + 037. Может быть, это const?

Ответы на вопрос(2)

Решение Вопроса

Решено:

Я думаю, что проблема была здесь

vector<unsigned char> byteVec;

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

Я удалил это и заменил его

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

тогда остальное работает нормально!

Кроме того, не забывайте использовать (байты) вместо (* байтов) здесь

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

Мне приходилось делать подобные вещи для отправки необработанных байтовых данных по TCP. Я использовал структуру, которая содержит одинunsigned char[4] массив и использованиеmemcpy скопировать байты в моих значениях с плавающей точкой в начало этого массива. Это может быть не идеально, но для моих целей это работает достаточно хорошо. Очевидно, что вы можете сделать обратное, чтобы получить данные.

 13 июн. 2012 г., 21:54
Да, вы совершенно правы. Реальность такова, что я создаю массивы без знака для хранения смешанных типов данных - я просто использовал 4, чтобы проиллюстрировать общую идею.
 rocklobster13 июн. 2012 г., 21:45
Могу ли я использовать memcpy для большого массива байтов для большого массива с плавающей точкой? Не уверен, будет ли эффективно делать по одному за раз.
 13 июн. 2012 г., 21:50
Вместо жесткого кодирования числа 4, вы должны использоватьsizeof(float) если быть точным.

Ваш ответ на вопрос