2012-06-13 89 views
3

我试图在float和unsigned char数组之间进行一些转换(在本例中为std :: vector),并且遇到了一些麻烦。将浮点型向量转换为字节向量并返回

我已经转换花车像这样unsigned char型矢量...

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; 

不知道如何让我的原始浮动值返回此。

感谢您的任何帮助。

+2

'的reinterpret_cast (字节);'(注意如何还有的括号内无星级)。 –

+0

我在帖子中说过我已经试过了。我打印出来的第一个值(字节)是-2.1267e + 037。也许它的常量? – rocklobster

回答

5

解决:

我认为这个问题是在这里

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

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

+0

我可以使用memcpy为大数组浮点数的字节大数组?不确定一次只能做一个效率高。 – rocklobster

+4

而不是硬编码数字4,你应该使用'sizeof(float)'是确切的。 – Attila

+2

是的,你很对。现实情况是我创建了unsigned char数组来存储混合数据类型 - 我只是用4来说明总体思路。 – mathematician1975

相关问题