将float 32 bit big endian转换为little endian

时间:2014-07-31 13:44:08

标签: c image-processing

我的数据是一个2d 32位二维指针图像,它是大端,我希望转换为小端。请检查以下代码:

  float** ReverseFloat( const float **inFloat )
 {
   float **retVal;
   char *floatToConvert = ( char* ) && inFloat;
   char *returnFloat = ( char* ) && retVal;

   // swap the bytes into a temporary buffer
   returnFloat[0] = floatToConvert[3];
   returnFloat[1] = floatToConvert[2];
   returnFloat[2] = floatToConvert[1];
   returnFloat[3] = floatToConvert[0];

   return retVal;
 }

您好。根据你的所有建议,我尝试了以下代码,但它给出了所有零值:

float **swapend( float **in ,float **out , int h, int v)
{
  char *floatToConvert = ( char* ) & in;
  char *returnFloat = ( char *) & out;
  for (int m=0; m<h; m++)
    for (int k=0; k<v; k++)
    {
      for (int i=0; i<sizeof(float); i++)
        returnFloat[sizeof(float)-1-i] = floatToConvert[i];
    }

  return out;
}

谢谢。

2 个答案:

答案 0 :(得分:2)

这不会可靠地运作。您创建一个局部变量retVal,最后返回它。在函数结束后,此变量的值最终将是随机的。

我认为这种方法会更好,因为编译器会完成大部分必要的复制:

float be2le( char * floatToConvert ) {
     float buffer;
     char * returnFloat = (char *) &buffer;

     ...swap...

     return buffer;
}

答案 1 :(得分:1)

&&logical and operator(它也可能带有像语义一样的指针作为gnu扩展名,但这是不可移植的),而&"address of” operator。您不需要使用指针指针:

float ReverseFloat(float inFloat ){
  float retVal;
  char *floatToConvert = ( char* ) &inFloat;
  char *returnFloat = ( char* ) &retVal;

  // swap the bytes into a temporary buffer
  returnFloat[0] = floatToConvert[3];
  returnFloat[1] = floatToConvert[2];
  returnFloat[2] = floatToConvert[1];
  returnFloat[3] = floatToConvert[0];
  return retVal;
}

请注意,此功能可以双向运行:它允许您从一个字节序转换为另一个字节序。

更新后:如果您希望转换数组中包含的多个值,只需按顺序对每个值应用此函数:

void ReverseFloatArray(unsigned int count, float *in, float *out){
    unsigned int i;
    for (i = 0; i < count; i++)
        out[i] = ReverseFloat(in[i]);
 }