二进制数据大小端转换实现

头文件中定义

int IsLittleEndian(void);

#define SWAP_SHORT(Var) Var = *(short*)SwapEndian((void*)&Var, sizeof(short))
#define SWAP_INT(Var) Var   = *(int*)SwapEndian((void*)&Var, sizeof(int))
#define SWAP_USHORT(Var) \
  Var = *(unsigned short*)SwapEndian((void*)&Var, sizeof(short))
#define SWAP_LONG(Var) Var = *(long*)SwapEndian((void*)&Var, sizeof(long))
#define SWAP_ULONG(Var) \
  Var = *(unsigned long*)SwapEndian((void*)&Var, sizeof(long))
#define SWAP_RGB(Var) Var    = *(int*)SwapEndian((void*)&Var, 3)
#define SWAP_FLOAT(Var) Var  = *(float*)SwapEndian((void*)&Var, sizeof(float))
#define SWAP_DOUBLE(Var) Var = *(double*)SwapEndian((void*)&Var, sizeof(double))

void* SwapEndian(void* Addr, const int Nb);

在源文件中实现

static long _TestEndian = 1;

int IsLittleEndian(void) { return *(char*)&_TestEndian; }

void* SwapEndian(void* Addr, const int Nb) {
  static char Swapped[16];
  switch (Nb) {
    case 2:
      Swapped[0] = *((char*)Addr + 1);
      Swapped[1] = *((char*)Addr);
      break;
    case 3: /* As far as I know, 3 is used only with RGB images */
      Swapped[0] = *((char*)Addr + 2);
      Swapped[1] = *((char*)Addr + 1);
      Swapped[2] = *((char*)Addr);
      break;
    case 4:
      Swapped[0] = *((char*)Addr + 3);
      Swapped[1] = *((char*)Addr + 2);
      Swapped[2] = *((char*)Addr + 1);
      Swapped[3] = *((char*)Addr);
      break;
    case 8:
      Swapped[0] = *((char*)Addr + 7);
      Swapped[1] = *((char*)Addr + 6);
      Swapped[2] = *((char*)Addr + 5);
      Swapped[3] = *((char*)Addr + 4);
      Swapped[4] = *((char*)Addr + 3);
      Swapped[5] = *((char*)Addr + 2);
      Swapped[6] = *((char*)Addr + 1);
      Swapped[7] = *((char*)Addr);
      break;
    case 16:
      Swapped[0]  = *((char*)Addr + 15);
      Swapped[1]  = *((char*)Addr + 14);
      Swapped[2]  = *((char*)Addr + 13);
      Swapped[3]  = *((char*)Addr + 12);
      Swapped[4]  = *((char*)Addr + 11);
      Swapped[5]  = *((char*)Addr + 10);
      Swapped[6]  = *((char*)Addr + 9);
      Swapped[7]  = *((char*)Addr + 8);
      Swapped[8]  = *((char*)Addr + 7);
      Swapped[9]  = *((char*)Addr + 6);
      Swapped[10] = *((char*)Addr + 5);
      Swapped[11] = *((char*)Addr + 4);
      Swapped[12] = *((char*)Addr + 3);
      Swapped[13] = *((char*)Addr + 2);
      Swapped[14] = *((char*)Addr + 1);
      Swapped[15] = *((char*)Addr);
      break;
  }
  return (void*)Swapped;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CppBlock

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值