题记:
DICOM专栏系列虽然写了多年,但是依然不能解决大家日常中遇到的种种问题,其实这恰恰就是程序员(码农)工作的最大乐趣所在。就像每个人的人生一样,所处的环境不同,所遭遇的事件不同,结果自然就不同。程序开发亦是如此,操作系统不同、软件版本不同,本地配置不同都会导致种种问题。
“授人以鱼不如授人以渔”,所以正常的解决之道是希望通过专栏的讲解,能够让大家真正理解每个问题出现的背后原因,从而主动排查并解决问题。对于排查和解决过程中遇到的问题,我会整理总结成博文供大家参考。正如上文所说,每个人的环境不同,自然真正的解决方案不同,所以仅仅是参考。
背景:
DICOM相关开源库很多,按照开发语言不同主流有三类,基于C/C++的dcmtk、基于Java的dcm4che、以及基于C#的fo-dicom(mDCM)。这里再次强调一下DCM4CHEE是基于dcm4che14版本基础上,采用EJB2.x技术开发依托于JBoss的DICOM归档服务框架,可以简单的理解为一个开源的PACS系统。每个库的维护机构和人员不同,因此导致版本和数据格式兼容性上都有所不同。尤其是当在自己的项目中使用的开源库版本升级后,如何平稳过度到最新版本,如何将修复的bug补丁到现有版本尤为关键。
我个人在项目中使用的诸多开源库,都会在github上fork一个个人私有库,平日里根据国内现状以及特殊性修复自己发现的bug,此外间隔一段时间会将主库的版本pull到本地进行merge。这样可以确保现有项目平稳运行,既能适应项目特殊性,又能兼容主版本相关补丁。本篇博文简单列举几个本地修复的问题,详情可参考我的github主页相关项目。
dcm4che14开源库:
1. CDimseService.cFIND()结果返回异常
cFIND()函数的部分源码如下:
// New Cammand Set, see: DICOM Part 7: Message Exchange, 6.3.1 Command
// Set Structure
Command rqCmd = dof.newCommand();
rqCmd.initCFindRQ(assoc.nextMsgID(), UIDs.StudyRootQueryRetrieveInformationModelFIND, priority);
Dimse findRq = aFact.newDimse(pc.pcid(), rqCmd, keys);
// Invoke