Стандарт 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-байтовое представление? - Бонусный балл, если это быстро!