结构体std :: vector的big-> little(little-> big)endian转换

问题描述:

如何对结构体的vector进行endian转换?结构体std :: vector的big-> little(little-> big)endian转换

例如:

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

std::vector<TestStruct> vTestVector; 

我知道如何交换int类型,但如何交换:自定义结构的整体载体?

+5

如果我理解你的结构,唯一需要endian交换的字段是nSomeNumber。所以就像平时一样绕着向量循环,然后只交换int字段。 char数组字段在两端都是相同的。 – bramp 2010-09-06 09:46:11

+0

您可以循环使用向量的元素,并将向位置转换应用于向量中的每个结构。或者你的问题是什么? – Dummy00001 2010-09-06 09:46:37

+0

如果'nSomeNumber'应该在某个时间通过网络,则应该使用固定大小的整数类型(类似于'uint16_t'或'uint32_t'),因为int的大小是**而不是** 。 – ereOn 2010-09-06 09:52:44

正如评论中所述。尾段交换向量中的每个元素:

auto iter = vTestVector.begin(); 
while(iter != vTestVector.end()) 
{ 
    EndianSwap(iter->nSomeNumber); 
    iter++; 
} 

#include <boost/foreach.hpp> 

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

给予或采取,这会做到这一点。你不需要影响字符串,只是数字变量。 s。

如果您正在寻找一种通用的方法来完成此操作(即,一段模板元编程代码,它可以让您遍历纯代码元素,递归到子代structs并随时转换多字节整数值他们遇到),那么你的运气不好。不幸的是,你不能迭代C++中任意struct的元素 - 所以你需要为每种不同的类型编写特殊的代码。