在 DCMTK 中将 OFString 转换为字符串或字符

Convert OFString to string or char in DCMTK

本文关键字:字符串 字符 转换 DCMTK 中将 OFString      更新时间:2023-10-16

我正在尝试使用 dcmtk 从 DICOM 映像中提取实例编号。代码如下所示:

DcmFileFormat fileformat;
    OFCondition status = fileformat.loadFile(src_path);
    if (status.good())
      {
        OFString instanceNumber=0;
        if (fileformat.getDataset()->findAndGetOFString(DCM_InstanceNumber, instanceNumber).good())
        {
            std::cout << "instance Number N: " << instanceNumber << std::endl;
            sprintf(instanceNum, "%sn", instanceNumber);
            printf("%sn", instanceNum);
        }
        else
            std::cerr << "Error: cannot access instance Number!" << std::endl;
       }
    else
        std::cerr << "Error: cannot read DICOM file (" << status.text() << ")" << std::endl;

现在我得到了实例编号,但我想将实例编号复制到字符或字符串(用于进一步编程)。但是由于数字是 OFString,我如何将其转换为所需的数据类型。有什么想法吗?

实际上,OFString 实现了 std::string 的一个子集,所以如果你想像其他人已经建议的那样获得一个"const char*",你可以使用 c_str()。或者,您也可以使用定义HAVE_STD_STRING编译 DCMTK,OFString 将与 std::string 相同。

当然,所有这些也在文档中进行了描述。

您可以使用 dcmtk 通过 findAndGetXXX 方法直接读取请求的数据类型。在您的特定情况下,实例编号的 VR 是 IS,因此要使用的方法是 findAndGetSint32。见:这里。

应用于您的代码:

DcmFileFormat fileformat;
OFCondition status = fileformat.loadFile(src_path);
if (status.good())
  {
    SInt32 instanceNumber=0;
    if (fileformat.getDataset()->findAndGetSint32(DCM_InstanceNumber, &instanceNumber).good())
    {
        std::cout << "instance Number N: " << instanceNumber << std::endl;
        sprintf(instanceNum, "%dn", instanceNumber);
        printf("%dn", instanceNum);
    }
    else
        std::cerr << "Error: cannot access instance Number!" << std::endl;
   }
else
    std::cerr << "Error: cannot read DICOM file (" << status.text() << ")" << std::endl;

应该工作...

您可以使用c_str()来获取const char*,并根据需要基于该string创建。

std::string s(instanceNumber.c_str());

在某些情况下(例如 Debian),操作系统会提供禁用标志DCMTK_ENABLE_STL编译的软件包。修补包不是一个好主意,因为这样你就必须重新编译依赖于它的每个包。

但有时你确实需要一个std::string,而OFString是行不通的。若要将OFString转换为一般std::string,可以使用以下代码片段:

std::string str(ofstr.data(), ofstr.length());

如果有的话,它还会复制任何嵌入的零。