2017-08-03 6 views
0

Basé sur this réponse à propos de l'encodage/décodage à base 64, et this répondre à propos de la conversion de float en vecteur byte et retour, j'essayais de convertir un vecteur flottant en hexadécimal ou binaire chaîne.Conversion du vecteur de flottants en chaîne hexadécimale/binaire

Ceci est mon code:

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; 

Le vecteur d'origine, flotteurs, est 262.144 flotteurs et les deux déclarations de 1.048.576 imprimer cout, puis les segfaults programme. Qu'est-ce que je fais mal?

De plus, existe-t-il une méthode meilleure ou plus rapide pour accomplir cela? Je veux envoyer la chaîne en utilisant xml/gsoap, donc si gsoap a une fonction pour le faire automatiquement, cela me faciliterait la vie.

+0

'unsigned char * bytesN = & (decodedData [0]); float * floatArray = reinterpret_cast (bytesN); '- Il n'est pas défini de réinterpréter un bloc de' char's comme un autre type. Cela viole les règles d'aliasing. Seul l'inverse est autorisé. Vous devriez 'memcpy' les octets dans un tableau réel, déclaré et alloué, de' floats' et ensuite lire cela. Même cela est fragile lorsque vous faites des suppositions sur la façon dont l'implémentation représente «float» et si cela correspond à celui qui les a encodés. En outre, il pourrait y avoir d'autres problèmes; il est difficile de lire ce morceau de code solide. Quelques nouvelles lignes et commentaires seraient bien. –

+1

Vous avez donc un vecteur d'éléments 'float'. Pour chaque élément que vous voulez encoder en hexadécimal dans une chaîne dans un nouveau vecteur? Et puis décoder le nouveau vecteur dans un deuxième vecteur de 'float'? C'est aussi simple que deux appels à ['std :: transform'] (http://en.cppreference.com/w/cpp/algorithm/transform). –

+0

@Someprogrammerdude bien, je veux que le vecteur entier soit une chaîne hexagonale, pas un nouveau vecteur d'autres chaînes. Transformeriez-vous encore pour ça? – anc

Répondre

1

Un problème majeur est le suivant:

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

Vous dites que le nombre d'éléments serait decodedData.size(), qui est 1048576. Mais il est faux car il ne devrait être que le quart de cela (parce que decodedData.size() est la taille en octets pas dans le nombre de float éléments). Cela va bien sûr conduire à sortir des limites de decodedData ce qui conduit à undefined comportement.

Vous devez diviser la taille de decodedData.size() avec sizeof(float):

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