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

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

2011-11-18 14:25 281 查看

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;


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