将浮点数向量转换为十六进制/二进制字符串

时间:2017-08-03 13:00:15

标签: c++ vector floating-point hex gsoap

基于this关于编码/解码到base 64的回答,以及this回答关于从float转换为字节向量和回传,我试图将浮点向量转换为十六进制或二进制字符串

这是我的代码:

vector<float> floats = ...;
const unsigned char* bytes = reinterpret_cast<const unsigned char*>(&floats[0]);
std::vector<unsigned char> byteVec(bytes, bytes + sizeof(float) * floats.size());
std::cout<<byteVec.size()<<std::endl;
std::string dat = base64_encode(&byteVec[0], byteVec.size());
std::vector<unsigned char> decodedData = base64_decode(dat);
std::cout<<decodedData.size()<<std::endl;
unsigned char* bytesN = &(decodedData[0]);    // point to beginning of memory
float* floatArray = reinterpret_cast<float*>(bytesN);
std::vector<float> floatVec(floatArray, floatArray + sizeof(unsigned char) * decodedData.size());   
std::cout<<floatVec.size()<<std::endl;

原始向量浮动,是262,144个浮点数,两个cout语句打印1048576,然后程序段错误。我做错了什么?

此外,还有更好或更快的方法来实现这一目标吗?我想使用xml / gsoap发送字符串,所以如果gsoap有一个自动执行此操作的函数,它将使我的生活更轻松。

1 个答案:

答案 0 :(得分:1)

一个主要问题是:

std::vector<float> floatVec(floatArray, floatArray + sizeof(unsigned char) * decodedData.size());

在这里,您说元素的数量为decodedData.size(),即1048576。但这是错误的,因为它应该只有四分之一(因为decodedData.size()字节中的大小而不是float元素的数量)。这当然会导致超出decodedData范围,从而导致未定义的行为

您需要将decodedData.size()的大小除以sizeof(float)

std::vector<float> floatVec(floatArray, floatArray + decodedData.size() / sizeof(float));