我有一个 struct
,它由多个 32 位元素组成。我应用了 #pragma pack (4)
,因此以下结构是线性且对齐的。
struct
{
int a; // 4 bytes
int b; // 4 bytes
int c; // 4 bytes
} mystruct; // total 16 bytes
如何交换这些元素中的每一个(little -> big endian)?
方法是void swap(void* a, int b);
,a
指向结构体,b
整数给出结构的大小。
例如:
void swap(void* a, int b)
{
//FIXME !
for (int i = 0; i < b; i+= 32)
{
a = (a & 0x0000FFFF) << 16 | (a & 0xFFFF0000) >> 16;
a = (a & 0x00FF00FF) << 8 | (a & 0xFF00FF00) >> 8;
a += 32;
}
}
最佳答案
你可以交换两个字节而不用临时:
void byteswap( unsigned char & a, unsigned char & b )
{
a ^= b;
b ^= a;
a ^= b;
}
现在让我们把它应用到可变长度的数字上
template< typename T >
void endianSwap( T & t )
{
unsigned char * first = reinterpret_cast< unsigned char * >( &t );
unsigned char * last = first + sizeof(T) - 1;
while( first < last )
{
byteswap( *first, *last );
++first;
--last;
}
}
对于您的结构,您可以:
void endianSwap( mystruct & s )
{
endianSwap( s.a );
endianSwap( s.b );
endianSwap( s.c );
}
当然,作为使用字节交换的 endianSwap 的替代方案,我们可以只使用 std::reverse。
template<typename T> endianSwap( T& t )
{
unsigned char * begin = reinterpret_cast<unsigned char *>(&t);
unsigned char * end = begin + sizeof( T );
std::reverse( begin, end );
}
关于c++ - 位交换和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13046147/