【问题标题】:Alternative representation for DICOM UID in CC 中 DICOM UID 的替代表示
【发布时间】:2015-11-19 09:57:04
【问题描述】:

DICOM 标准使用以下规则定义 UID(请参阅9.1 UID Encoding Rules)。基本上所有 UID 都匹配以下正则表达式:[0-9.]{64}。 所以在 C 中,幼稚的表示会是这样的:

使用 typedef:

typedef char (uid_t)[64];

使用结构:

typedef struct { char repr[64]; } UID 

这需要 64 字节的存储空间,并且需要调用 memcmpstrcmp 之类的东西来比较两个实例。

以上表示允许表示最多(2^8)^64 ~ 1.3407807929942597e+154 不同的 UID。

但是,如果仔细查看表示(如果我们省略组件的第一个数字不应为零的规则)。我们看到只有(10 + 1)^64 ~ 4.4579156845259026e+66 可能的UID(我们有足够的空间)。

由于(2^8)^32 ~ 1.157920892373162e+77,我现在可以将我最初的幼稚表示替换为:

使用 typedef:

typedef char (uid_t)[32];

使用结构:

typedef struct { char repr[32]; } UID 

所以我的问题是:

  • 哪种转换能够将我的 64 字节 UID:[0-9.]{64} 的初始输入转换为 32 字节表示?
  • 如果速度快的话,加分!

【问题讨论】:

标签: c dicom


【解决方案1】:

根据您对 UID 的描述,它们只是以基数 11 编码。您建议的表示形式是基数 256。您所要做的就是使用基数转换算法。

【讨论】:

    【解决方案2】:

    我想我可以简单地做一个packed BCD 表示:

    typedef struct
    {
      uint8_t v01 : 4; // [0-9] -> [0b - 0b1001] and '.' (0b1010)
      uint8_t v02 : 4; // 
    } dummy;
    
    typedef struct
    {
      dummy array[32];
    } UID;
    

    这应该比简单的基本转换算法更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 2015-12-17
      • 2012-05-04
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多