DICOM标准使用以下规则定义UID(请参阅9.1 UID编码规则)。基本上,所有的UID都匹配以下正则表达式:[0-9.]{64}
。因此,在C:中,天真的表示应该是这样的
使用typedef:
typedef char (uid_t)[64];
使用结构:
typedef struct { char repr[64]; } UID
这需要64字节的存储空间,并且需要调用类似memcmp
或strcmp
的东西来比较两个实例。
上述表示允许表示多达(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字节的表示 - 如果速度快,可获得额外积分
根据您对UID的描述,它们只是在基11中进行编码。您建议的表示法是256基数。您所要做的就是使用基本转换算法。
我想我可以简单地做一个压缩BCD表示:
typedef struct
{
uint8_t v01 : 4; // [0-9] -> [0b - 0b1001] and '.' (0b1010)
uint8_t v02 : 4; //
} dummy;
typedef struct
{
dummy array[32];
} UID;
这应该比简单的基本转换算法更快。