Fo-dicom:如何添加 "empty, if unknown" 整数字符串类型 2 属性

Fo-dicom: How to add "empty, if unknown" integer string type 2 attribute

有一个类型为 2 的标签(“必需,如果未知则为空”),其值表示形式 Integer String 我想将其留空。我试过像这样创建属性:

var attribute = new DicomIntegerString(DicomTag.SeriesNumber, string.Empty);

文件存储有效。当我再次读取文件时,以下调用的结果 returns null:

var result = dicomDataset.GetString(DicomTag.SeriesNumber); // <-- this is null

如何将元素正确设置为“零长度”或“如果未知则为空”?

谢谢。

正如评论中已经提到的,在数据​​集中设置空字符串的代码是正确的:

dataset.AddOrUpdate(new DicomIntegerString(DicomTag.SeriesNumber, string.Empty));

请注意,您还可以写一个 null 值:

dataset.AddOrUpdate(new DicomIntegerString(DicomTag.SeriesNumber, (string)null));

写出数据集将为 SeriesNumber 创建一个空标签,两种情况下的方式完全相同,因为这两种情况在 DICOM 中是等效的。

读回标签的代码也是正确的,它 returns null 的事实是由于这种等价性,这在解释空字符串标签时产生了歧义在 DICOM 中。由于 DICOM 字符串标签中的值数量仅由字符串本身(及其包含的反斜杠数量)定义,因此没有值的标签(通常由 null 值表示)之间没有区别),以及一个带有空字符串的标签(将由 "" 值表示)。为了与其他标签保持一致,return null 对于带有 VM 0 的标签是有意义的 - 对于 non-string VR,这里没有歧义,因为定义了值的长度。对于字符串值,return 一个空字符串也可能有意义 - 两种方法都有利有弊,所以最终它是库创建者的设计决定。

fo-dicom 中,最好同时处理这两种情况(例如使用 string.IsNullOrEmpty 之类的东西)。如果你从文件数据集中读取值,你总是得到 null,但如果你将空字符串写入数据集中的标签(如上所示的第一个版本)并读回,你将得到相同的空字符串字符串返回。

顺便说一句:在 pydicom(常见的 Python DICOM 库)中有一个关于相同设计决策的 discussion,最后添加了一个配置条目定义行为(例如 return None 或此类值的空字符串)。