您的位置:首页 > 编程语言

opengl红宝书 第8章的代码中readImage()的简单解决方法(Intel 处理器上)

2007-10-31 17:14 330 查看

opengl红宝书 第8章的代码在Intel 处理器上, readImage()读取不正确.

原因如下 :

字节交换(byte swapping):高位优先(big endians)和低位优先(little
endians)
高位优先和低位优先,指的是两种不同的方式,把整数储存在计算机中的的方式。因为整数是多于一个字节的,那么,问题在于:最重要的字节是否应该首先被读写。最不重要的字节是变化的最频繁的。这就是,如果你不断给一个整数加一,最不重要的字节要改变256次,次不重要的字节才只变化一次。
不同的处理器用不同的方式储存整数。Intel
处理器一般用低位优先方式来储存整数,换句话说,低位首先被读写。大多数其它处理器用高位优先方式来储存整数。因此,当二进制文件在不同平台上读写时,你就有可能不得不对字节重新排序以便得到正确的顺序。
在 UNIX 平台上,还有一种特殊的问题,因为UNIX可以在Sun
Sparc处理器、HP处理器、IBM Power PC、Inter的芯片等多种处理器上运行。当从一种处理器转移到另一种处理器上时,就意味着那些变量的字节排列顺序必须翻转,以便于它们能满足新处理器所要求的顺序。

最简单的修改方法:


GLubyte*


readImage( const char* filename, GLsizei* width, GLsizei *height )




...{


    int       n;


    GLubyte*  pixels;




    FILE* infile = fopen( filename, "rb" );






    if ( !infile ) ...{


    fprintf( stderr, "Unable to open file '%s' ", filename );


    return NULL;


    }








    /**//*fread( &byHeightLow, sizeof( BYTE ), 1, infile );


    fread( &byHeightHi, sizeof( BYTE ), 1, infile );*/


    *width = 599;


    *height = 401;


    n = 3 * (*width) * (*height);




    pixels = (GLubyte *) malloc( n * sizeof( GLubyte ));




    if ( !pixels ) ...{


    fprintf( stderr, "Unable to malloc() bytes for pixels " );


    return NULL;


    }




    fread( pixels, sizeof( GLubyte ), n, infile );


    


    fclose( infile );




    return pixels;


}

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  byte unix null 平台 sun file
相关文章推荐