读取Varian OBI 采集的hnd格式图像

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个字节)

接下来是对数据元素的解析,这个我还没找到方法,因为这个数据是压缩数据。等待我找到方法再告知大家。

上一篇:04.原型模式设计思想


下一篇:node的使用-缺点: