dicom文件dir的读取C语言实现

这是一个纯C语言写的dir文件的读取,我加以改进,主要把病人的信息和dir里面文件的各个文件的路径给保存下来。

这个程序时一次在论坛上搜到的,据说是一个小日本写的。我在VS2008中使用过,现在不搞这个了,把源代码给贴上来,希望对搞医学图像方面的人有帮助。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *fp;
static int Patients_number;
typedef struct _ImageProperty
{
 int height;
 int width;
 long min;
 long max;
}iproperty;

iproperty ip;

struct Paitent{
 char    name[100];
 char date[30];
 char parts[100];
 short int first;
};

typedef struct _Tag{
 unsigned short   group;
 unsigned short   element;
}tag;
typedef enum
{
 unknown=0,
 StudyDescription,
 StudyDate,
 ImageTime,
 Manufacturer,
 InstitutionName,
 PatientsName,
 PatientsSize,
 PatientsWeight,
 SliceThickness,
 Gantry,
 SliceLocation,
 Rows,
 Columns,
 PixelSpacing,
 PixelAspectRatio,
 BitsAllocated,
 BitsStored,
 HighBit,
 PixelRepresentation,
 SmallestImagePixelValue,
 LargestImagePixelValue,
 WindowCenter,
 WindowWidth,
 PixelData,
 GroupLength,
 FilesetID,
 FilesetDescriptorFileID,
 SpecificCharacterSetOfFilesetDescriptorFile,
 OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity,
 OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity,
 FilesetConsistencyFlag,
 DirectoryRecordSequence,
 OffsetOfTheNextDirectoryRecord,
 RecordInuseFlag,
 OffsetOfReferencedLowerLevelDirectoryEntry,
 DirectoryRecordType,
 PrivateRecordUID,
 ReferencedFileID,
 MRDRDirectoryRecordOffset,
 ReferencedSOPClassUIDInFile,
 ReferencedSOPInstanceUIDInFile,
 ReferencedTransferSyntaxUIDInFile,
 NumberOfReferences
}datatype;

typedef enum
{
 i16=0,
 i32,
 other
}datasize;

static int fileNo;
char **fileList;
Paitent * partent_Num;
int
myfputs(const char *str, FILE *stream)
{
 //return fputs(str,stream);
 return  1;

}

int
readSQ(char** fl)
{
 int Count;
 tag t;
 datatype dt;
 datasize sz;
 short size16;
 short data16;
 long data32;
 long size32;
 size_t size;
 char VR[3];
 char *Value;
 VR[0]=VR[1]=VR[2]=0;
 FILE *fpcp;
 if (fl == 0){
  Count=1;
 }else{
  Count=0;
 }
 if (0 == fread(&t,sizeof(_Tag),1,fp)){
  return 1;
 }
 fpcp = fp;
#ifdef DEBUG
 fprintf(stderr,"%X,%X,",t.group,t.element);
#endif
 switch (t.group){
 case 0xFFFE:/
  switch(t.element){
 case 0xE000:
  myfputs("---------------start--------------/n", stderr);
  fseek(fp,4,SEEK_CUR);
  return 0;
  break;
 case 0xE00D:
  myfputs("-----------------end--------------/n",stderr);
  return 0;
  }
  break;
 case 0x0004:///
  switch(t.element){
 case 0x0000:
  dt=GroupLength;
  myfputs("GroupLength,",stderr);
  break;
 case 0x1130:
  dt=FilesetID;
  myfputs("FilesetID,",stderr);
  break;
 case 0x1141:
  dt=FilesetDescriptorFileID;
  myfputs("FilesetDescriptorFileID,",stderr);
  break;
 case 0x1142:
  dt=SpecificCharacterSetOfFilesetDescriptorFile;
  myfputs("SpecificCharacterSetOfFilesetDescriptorFile,",stderr);
  break;
 case 0x1200:
  dt=OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity;
  myfputs("OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity,",stderr);
  break;
 case 0x1202:
  dt=OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity;
  myfputs("OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity,",stderr);
  break;
 case 0x1212:
  dt=FilesetConsistencyFlag;
  myfputs("FilesetConsistencyFlag,",stderr);
  break;
 case 0x1220:
  dt=DirectoryRecordSequence;/
  myfputs("DirectoryRecordSequence,",stderr);
  break;
 case 0x1400:
  dt=OffsetOfTheNextDirectoryRecord;
  myfputs("OffsetOfTheNextDirectoryRecord,",stderr);
  break;
 case 0x1410:
  dt=RecordInuseFlag;
  myfputs("RecordInuseFlag,",stderr);
  break;
 case 0x1420:
  dt=OffsetOfReferencedLowerLevelDirectoryEntry;
  myfputs("OffsetOfReferencedLowerLevelDirectoryEntry,",stderr);
  break;
 case 0x1430:
  dt=DirectoryRecordType;
  myfputs("DirectoryRecordType,",stderr);
  break;
 case 0x1432:
  dt=PrivateRecordUID;
  myfputs("PrivateRecordUID,",stderr);
  break;
 case 0x1500:
  dt=ReferencedFileID;///
  myfputs("ReferencedFileID,",stderr);///
  break;
 case 0x1504:
  dt=MRDRDirectoryRecordOffset;
  myfputs("MRDRDirectoryRecordOffset,",stderr);
  break;
 case 0x1510:
  dt=ReferencedSOPClassUIDInFile;
  myfputs("ReferencedSOPClassUIDInFile,",stderr);
  break;
 case 0x1511:
  dt=ReferencedSOPInstanceUIDInFile;
  myfputs("ReferencedSOPInstanceUIDInFile,",stder

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值