DICOM UID在C中的替代表示法

DICOM UID在C中的替代表示法,c,dicom,C,Dicom,DICOM标准使用以下规则定义UID(请参阅)。基本上所有UID都匹配以下正则表达式:[0-9.]{64}。 因此,在C中,朴素的表示类似于这样: 使用typedef: typedef char (uid_t)[64]; typedef char (uid_t)[32]; 使用结构: typedef struct { char repr[64]; } UID typedef struct { char repr[32]; } UID 这需要64字节的存储空间,并且需要调用类似于mem

DICOM标准使用以下规则定义UID(请参阅)。基本上所有UID都匹配以下正则表达式:
[0-9.]{64}
。 因此,在C中,朴素的表示类似于这样:

使用typedef:

typedef char (uid_t)[64];
typedef char (uid_t)[32];
使用结构:

typedef struct { char repr[64]; } UID 
typedef struct { char repr[32]; } UID 
这需要64字节的存储空间,并且需要调用类似于
memcmp
strcmp
的函数来比较两个实例

上述表示法最多可表示
(2^8)^64~1.3407807807929942597E+154
不同的UID

但是,如果仔细观察表示(如果我们忽略了组件的第一个数字不应为零的规则)。我们看到只有
(10+1)^64~4.45791568455259026E+66
可能的UID(而且我们有足够的空间)

由于
(2^8)^32~1.157920892373162e+77
我现在可以用以下内容替换我最初的天真表达:

使用typedef:

typedef char (uid_t)[64];
typedef char (uid_t)[32];
使用结构:

typedef struct { char repr[64]; } UID 
typedef struct { char repr[32]; } UID 
所以我的问题是:

  • 哪种转换可以将我最初输入的64字节UID:
    [0-9.]{64}
    转换为32字节表示
  • 如果这是快速的,奖励点
根据您对UID的描述,UID仅以基数11编码。您建议的表示是以256为基数。您所要做的就是使用一个基转换算法。

根据您对UID的描述,它们只需在基11中编码即可。您建议的表示是以256为基数。你所要做的就是使用一个基本的转换算法。

我想我可以做一个简单的表示:

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

typedef struct
{
  dummy array[32];
} UID;

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

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

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

typedef struct
{
  dummy array[32];
} UID;

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

这不是计算机科学问题。迁移到。这不是计算机科学问题。迁移到。