将浮点向量转换为字节向量并返回

Convert float vector to byte vector and back

本文关键字:向量 字节 返回 转换      更新时间:2023-10-16

我正在尝试在浮点数和无符号字符数组之间进行一些转换(在本例中为 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;

不知道如何从中恢复我的原始浮点值。

感谢您的任何帮助。

已解决:

我认为问题就在这里

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将浮点值中的字节复制到此数组的开头。它可能并不理想,但它确实足以满足我的目的。显然,您可以执行相反的操作来检索数据。