【问题标题】:Convert float vector to byte vector and back将浮点向量转换为字节向量并返回
【发布时间】:2012-06-13 19:35:25
【问题描述】:

我正在尝试在 float 和 unsigned char 数组(在本例中为 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

我尝试在最后一部分中使用 (bytes) 而不是 (*bytes) ,但打印出错误的值。这样做也会打印错误的值

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

不知道如何从这里取回我原来的浮点值。

感谢您的帮助。

【问题讨论】:

  • reinterpret_cast&lt;float*&gt;(bytes);(注意括号内没有星号)。
  • 我已经在我的帖子中说过我已经尝试过了。我使用(字节)打印出来的第一个值是-2.1267e+037。也许它的常量?

标签: c++ floating-point byte


【解决方案1】:

已解决:

我认为问题出在这里

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

然后其余的工作正常!

另外,记得在这里使用 (bytes) 而不是 (*bytes)

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

【讨论】:

    【解决方案2】:

    为了通过 TCP 发送原始字节数据,我不得不做这种事情。我使用了一个包含单个 unsigned char[4] 数组的结构,并使用 memcpy 将我的浮点值中的字节复制到该数组的开头。它可能并不理想,但对于我的目的来说它确实足够好。显然,您可以反过来检索数据。

    【讨论】:

    • 我可以使用 memcpy 将大字节数组转换为大浮点数组吗?不确定一次做一个是否有效。
    • 确切地说,您应该使用sizeof(float),而不是硬编码数字4。
    • 是的,你说的很对。实际情况是我创建了 unsigned char 数组来存储混合数据类型 - 我只是使用 4 来说明总体思路。
    猜你喜欢
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    相关资源
    最近更新 更多