2017-08-03 167 views
0

基于this关于编码/解码为基础64的答案和this关于从浮点数转换为字节向量并返回的答案,我尝试将浮点向量转换为十六进制或二进制串。将浮点数向量转换为十六进制/二进制字符串

这是我的代码:

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有一个自动执行此操作的函数,它会让我的生活变得更容易。

+0

'无符号字符* bytesN =(decodedData [0]); float * floatArray = reinterpret_cast (bytesN);' - 未定义重新解释'char'作为另一种类型的块。它违反了别名规则。只有反面是允许的。你应该将字节'memcpy'写入一个实际的,声明的&分配的'floats'数组中,然后读取它。即使这样做很脆弱,因为您正在对实现如何表示“浮动”以及是否与编码它们的编码相匹配做出了假设。另外,还可能有其他问题。很难阅读这个坚实的代码块。一些换行和评论会很好。 –

+1

所以你有一个'float'元素的向量。对于每个你想要将它编码为一个新的向量中的字符串的元素?然后将新的矢量解码为“float”的第二个矢量?就像两次调用['std :: transform'](http://en.cppreference.com/w/cpp/algorithm/transform)一样简单。 –

+0

@Someprogrammerdude好吧,我希望整个向量是一个十六进制字符串,而不是其他字符串的新向量。转化仍然会为此工作吗? – anc

回答

1

的一个主要问题是:

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

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

您需要使用sizeof(float)划分的decodedData.size()大小:

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