C 中 DICOM UID 的替代表示
Alternative representation for DICOM UID in C
DICOM 标准定义了具有以下规则的 UID(参见 9.1 UID Encoding Rules)。基本上所有 UID 都匹配以下正则表达式:[0-9.]{64}
。
所以天真的表示在 C:
中会是这样的
使用类型定义:
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 char (uid_t)[32];
使用结构:
typedef struct { char repr[32]; } UID
所以我的问题是:
- 哪个转换能够将我的初始输入 64 字节 UID:
[0-9.]{64}
转换成这个 32 字节表示形式?
- 速度快加分!
根据您对 UID 的描述,它们只是以 base 11 编码。您建议的表示形式是 base 256。您所要做的就是使用 base 转换算法。
我想我可以简单地做一个 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;
这应该比简单的碱基转换算法更快。
DICOM 标准定义了具有以下规则的 UID(参见 9.1 UID Encoding Rules)。基本上所有 UID 都匹配以下正则表达式:[0-9.]{64}
。
所以天真的表示在 C:
使用类型定义:
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 char (uid_t)[32];
使用结构:
typedef struct { char repr[32]; } UID
所以我的问题是:
- 哪个转换能够将我的初始输入 64 字节 UID:
[0-9.]{64}
转换成这个 32 字节表示形式? - 速度快加分!
根据您对 UID 的描述,它们只是以 base 11 编码。您建议的表示形式是 base 256。您所要做的就是使用 base 转换算法。
我想我可以简单地做一个 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;
这应该比简单的碱基转换算法更快。