我的数据是一个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;
}
谢谢。
答案 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]);
}