1 hnd格式文件介绍
Varian的CBCT它叫OBI,其图像格式很奇特,是hnd格式。HND 文件格式是 HelpNDoc 使用的一种项目文件格式,它基于 SQLite 数据库格式。HND 格式包含优化功能,可加快磁盘读写操作。
文件格式定义了文件中数据的结构。每种文件格式都有一个唯一的扩展名,几乎都有一个唯一的签名。例如,Microsoft Word 文档的扩展名是 .docx,签名(通常是文件的前 3 个字符)是 PK。文件扩展名、签名和文件格式必须匹配,否则打开文件时就会出错。因此,为了确定文件格式和相关程序,对文件进行详细分析至关重要。我们对 HND 文件的分析结果如下:
HND 并不是常用的文件扩展名。这种文件类型主要由个别程序使用。不过,以下两种文件格式很常见:
1.1 80%的 HND 文件基于流行的 SQL 文件格式。SQL 文件包含一个轻量级的 SQLite 数据库,在应用程序开发中广泛用于存储与应用程序相关的数据。其内容由难以辨认的二进制数据组成,只能由相关程序读取和解释。文件平均大小为 3 MB,大多数文件大小在 640 KB 到 31 MB 之间。这种文件类型以尖端技术为基础。文件中几乎总能找到某些单词,如 SQLite 格式 3。 此类文件具有以下标签:manual、help、user、guide、geoportal、sampvoice、builder、sistema 和 stack。
1.2 在所有 HND 文件中,有 6% 的文件以神奇字节 VARIAN_VA_INTERNAL_HND_1.0 开头,这始终是这种文件格式的第一个字节。它们由难以辨认的神秘字符组成。文件大小通常在 1 MB 到 1.4 MB 之间。关键字 VARIAN_VA_INTERNAL_HND_1.0 是这些文件的典型特征。文件名的一个例子是 Proj_00000.hnd。这些文件可以链接到框架。
1.3 在所有 HND 文件中,剩余的 14%是具有不同签名的不同文件。
2 获取hnd文件的信息
定义一个struct:
typedef struct hnd_header{
char sFileType[32];
unsigned int FileLength;
char sChecksumSpec[4];
unsigned int nCheckSum;
char sCreationDate[8];
char sCreationTime[8];
char sPatientID[16];
unsigned int nPatientSer;
char sSeriesID[16];
unsigned int nSeriesSer;
char sSliceID[16];
unsigned int nSliceSer;
unsigned int SizeX;
unsigned int SizeY;
double dSliceZPos;
char sModality[16];
unsigned int nWindow;
unsigned int nLevel;
unsigned int nPixelOffset;
char sImageType[4];
double dGantryRtn;
double dSAD;
double dSFD;
double dCollX1;
double dCollX2;
double dCollY1;
double dCollY2;
double dCollRtn;
double dFieldX;
double dFieldY;
double dBladeX1;
double dBladeX2;
double dBladeY1;
double dBladeY2;
double dIDUPosLng;
double dIDUPosLat;
double dIDUPosVrt;
double dIDUPosRtn;
double dPatientSupportAngle;
double dTableTopEccentricAngle;
double dCouchVrt;
double dCouchLng;
double dCouchLat;
double dIDUResolutionX;
double dIDUResolutionY;
double dImageResolutionX;
double dImageResolutionY;
double dEnergy;
double dDoseRate;
double dXRayKV;
double dXRayMA;
double dMetersetExposure;
double dAcqAdjustment;
double dCTProjectionAngle;
double dCTNormChamber;
double dGatingTimeTag;
double dGating4DInfoX;
double dGating4DInfoY;
double dGating4DInfoZ;
double dGating4DInfoTime;
}Hnd_header;
这个文件头是在网上搜素到的,然后自己定义每个变量的读取方法
// 用来获取unsigned char 类型的数据
char* getChars(fstream& f,int length){
char buffer[length];
char* str=new char[length+1];
char* ptr=str;
f.read(buffer,length);
for(int i=0;i<length;i++){
*ptr=buffer[i];
ptr++;
}
*ptr='\0';
return str;
}
// 获取整型数据
unsigned int getInt(fstream& f){
char buffer[4];
f.read(buffer,4);
unsigned int value=(unsigned)buffer[0]<<0|(unsigned)buffer[1]<<8|(unsigned)buffer[2]<<16|(unsigned)buffer[3]<<24;
return value;
}
// 获取双精度 double数据的方法
double getDouble(fstream& f){
char buffer[8];
f.read(buffer,8);
double value;
memcpy(&value,buffer,sizeof(double));
return value;
}
读取结果如下:
图1读取结果(一共读取488个字节)
接下来是对数据元素的解析,这个我还没找到方法,因为这个数据是压缩数据。等待我找到方法再告知大家。