You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 23:17:08