c++ - 位交换和指针

标签 c++ byte swap endianness

我有一个 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/

相关文章:

c++ - (简单?)指向非静态成员函数的指针问题

c++ - 在 C++ 中初始化抽象基类的子类数组

java - 如何将多个字节加在一起?

python - 将 8 位值转换为 24 位值

c++ - 在 C++ 中使用指针在 3 个变量之间旋转值

c++ - 存储和访问对象位置 vector

c++ - 如果 C++ 调用堆栈的顶部是 "???",地址全为零,这意味着什么?

byte - "word"是多少位?

使用 Circleci config.yml 进行 Azure 应用服务插槽和交换部署

Python:如何有效地创建数组的所有可能的 2 元素交换?