今天在学习Esri的shp文件格式的时候,想用这样一个结构体读shp的头(100个字节):
struct FileHeader {
int iFileCode;
int iUnusedA;
int iUnusedB;
int iUnusedC;
int iUnusedD;
int iUnusedE;
int iFileLength;
int iVersion;
int iShapeType;
double dBoundXmin;
double dBoundYmin;
double dBoundXmax;
double dBoundYmax;
double dBoundZmin;
double dBoundZmax;
double dBoundMmin;
double dBoundMmax;
};
这个结构是根据Shp的白皮书写的。9个int和8个double,刚刚是100个字节。按道理可以读出shp的头:
const char * cpFileSpec = "E:/Data/rough/DemoDataForArcGIS/ShpFormat/File_Header.shp";
int iFileHandler = open(cpFileSpec, O_BINARY|O_RDONLY);
const SIZE_FILE_HEADER = 104;
read(iFileHandler, fileHeader, SIZE_FILE_HEADER);
先不说其中的Big Order endian和Little Order endian的区别,导致数据读入结果错误(这是意料中的)。但是我的空shp文件“File_Header.shp”本身就100个字节(没有任何数据),最后读出的结果是:
dBoundMmax = -6.2774359784999e+066
其他的几个double都是0.0000000000,看起来就是最后一个错了。
1 把最后一个dBoundMmax改成char[8],结果
char[0] = '0';
char[1] = '0';
char[2] = '0';
char[3] = '0';
char[4] = '-51';
char[5] = '-51';
char[6] = '-51';
char[7] = '-51';
这就奇怪了!-51怎么来的?用UltraEdit打开看也没有啊。于是想想是不是前面就已经多读了4个?重新数了一下int还是9个,看来我小学学得还可以。
2 用sizeof(FileHeader)一看,结果是104,多了4个字节。
类似的创建一个结构体:
struct Mixture {
int i;
double d;
};
sizeof(Mixture)的结果是16。难道int i 这个成员占了8个字节?
回答是肯定的。这是由于内存对齐造成的,建议看这篇文章,写得太好了:
http://blog.youkuaiyun.com/soloist/archive/2004/12/12/213717.aspx
本文探讨了使用C语言结构体解析Esri shp文件格式头部信息的过程及遇到的问题。通过分析发现,内存对齐问题导致读取的数据超出预期长度。
943

被折叠的 条评论
为什么被折叠?



