C中DICOM UID的替代表示

时间:2015-11-19 09:57:04

标签: c dicom

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字节的表示形式?
  • 如果这很快就会获得奖励!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我想我只能做一个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;

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