【发布时间】: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 字节的存储空间,并且需要调用 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 字节表示? - 如果速度快的话,加分!
【问题讨论】:
-
这不是一个计算机科学问题。迁移到Stack Overflow。