Альтернативное представление DICOM UID на C

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

person malat    schedule 19.11.2015    source источник
comment
Это не вопрос информатики. Переход на Stack Overflow.   -  person Raphael    schedule 19.11.2015


Ответы (2)


Согласно вашему описанию UID, они просто закодированы в базе 11. Предлагаемое вами представление - база 256. Все, что вам нужно сделать, это использовать базовый алгоритм преобразования.

person Yuval Filmus    schedule 19.11.2015

Я думаю, что могу сделать просто упакованное BCD представление:

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

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

Это должно быть быстрее, чем простой базовый алгоритм преобразования.

person malat    schedule 19.11.2015