2010-09-06 9 views
1

Comment effectuer une conversion endian sur un vecteur de structures?Big-> little (little-> big) conversion endian de std :: vecteur de structures

Par exemple:

struct TestStruct 
{ 
    int nSomeNumber; 
    char sSomeString[512]; 
}; 

std::vector<TestStruct> vTestVector; 

Je sais comment échanger des valeurs int, mais comment remplacer un vecteur ensemble de struct personnalisés?

+5

Si je comprends votre structure, le seul champ qui nécessite un échange endian est le nSomeNumber. Il suffit donc de boucler le vecteur comme vous le feriez normalement et d'échanger uniquement le champ int. Le champ tableau de char serait le même sur les deux endians. – bramp

+0

Vous bouclez les éléments du vecteur et appliquez la conversion d'endianness à chaque structure du vecteur. Ou quelle est votre question? – Dummy00001

+0

Si 'nSomeNumber' est supposé passer sur le réseau à un moment donné, vous devez utiliser un type entier de taille fixe (quelque chose comme' uint16_t' ou 'uint32_t') car la taille de' int' n'est pas ** garantie . – ereOn

Répondre

2

Comme indiqué dans les commentaires. échange endian chaque élément dans le vecteur:

auto iter = vTestVector.begin(); 
while(iter != vTestVector.end()) 
{ 
    EndianSwap(iter->nSomeNumber); 
    iter++; 
} 
0
#include <boost/foreach.hpp> 

BOOST_FOREACH(TestStruct& s, vTestVector) 
{ 
    SwapEndian(s.nSomeNumber); 
} 

ou à prendre, ça va le faire. Vous n'avez pas besoin d'affecter la chaîne char, juste la variable numérique. s.

0

Si vous êtes à la recherche d'une manière générale de le faire (par exemple un seul morceau de code de modèle de metaprogramming qui vous permettra de parcourir les éléments d'un struct, récursion dans struct sous plaine s et la conversion des valeurs entières multi-octets chaque fois ils sont rencontrés) alors vous n'avez pas de chance. Malheureusement, vous ne pouvez pas itérer sur les éléments d'un struct arbitraire en C++ - vous aurez donc besoin d'écrire du code spécial pour chaque type différent.