在handle_store读取数据集遇ValueError:私有UID类型无法识别的原因及存储方案
问题描述
在handle_store()方法中读取事件数据集时出现错误:
ValueError: Can't determine UID type for private UIDs。
堆栈跟踪信息:
File "/dicom_cmove_scp.py", line 203, in handle_store ds = event.dataset File "/usr/lib/python3.9/site-packages/pynetdicom/events.py", line 621, in dataset return self._get_dataset("DataSet", msg) File "/usr/lib/python3.9/site-packages/pynetdicom/events.py", line 823, in _get_dataset t_syntax.is_implicit_VR, File "/usr/lib/python3.9/site-packages/pydicom/uid.py", line 99, in is_implicit_VR if self.is_transfer_syntax: File "/usr/lib/python3.9/site-packages/pydicom/uid.py", line 134, in is_transfer_syntax raise ValueError("Can't determine UID type for private UIDs.") ValueError: Can't determine UID type for private UIDs.
请问该问题产生的原因是什么?是否可以不读取UID就存储文件用于后续排查?
问题分析与解决方案
错误原因
这个错误的核心是接收的DICOM数据使用了私有传输语法UID。pydicom仅能识别标准注册的传输语法UID,对于厂商自定义的私有UID,它无法判定其类型(比如属于传输语法、SOP类还是其他类别),因此触发该异常。
当调用event.dataset时,pynetdicom会尝试解析数据集,这一步需要先确定传输语法的VR编码方式(显式/隐式),而判断VR编码的前提是确认UID是否为传输语法类型——私有UID无法通过这个校验,最终导致报错。
不解析UID直接存储的可行性
完全可以跳过数据集解析,直接保存原始DICOM字节流用于后续排查,具体实现方式如下:
def handle_store(event): # 获取未解析的原始DICOM字节数据 raw_dicom_data = event.msg.get_value() # 将原始数据写入文件 with open("troubleshoot_private_uid.dcm", "wb") as f: f.write(raw_dicom_data) return 0x0000 # 返回DICOM存储成功的状态码
这种方式不需要解析UID和数据集,能完整保留问题数据,后续可以用专业DICOM工具(如dcmdump、MicroDicom)分析私有UID的具体信息,或者联系设备厂商确认该私有传输语法的细节。
内容的提问来源于stack exchange,提问作者ShoibAhamed
相关产品推荐
相关产品推荐

