> > Получается, что задача сводится к тому, чтобы > представить > > 128-бит GUID в виде 16 строковых символов XML. > > Совершенно верно.
Еще одно уточнение. Каким именно элементом XML-я является этот DocID (насколько я понял это атрибут в стартовом теге типа <document DocID="guidbla-bla-bla" ....>)
Стандарт описывает значение атрибута как
AttValue ::= '"' ([^<&"] | Reference)* '"'
| "'" ([^<&'] | Reference)* "'"
---
Это означает всего лишь, что в значении атрибута, ограниченном кавычками запрещены только три символа: '<', '&' и '\"'
Ну а в значении атрибута, ограниченном апострофами, соответственно вместо кавычки запрещен апостроф.
Reference это &, < и т.д.
Кстати, понимает ли ваш клиент reference-ы? Если да, то проблемы нет вообще. Просто записать в атрибуте 16 байт, заменяя все кавычки, амперсанды и знаки меньше их reference-ами. Если нет, то все как написал leo, используя алфавит из 253-х символов.
> Интересно. Но в силу моей тугодомчивости, не совсем > понятно. > Есть последовательность из 16 байт. Есть алфавит из, пусть, > 64 литер.
64 - мало. Нужно сохранить как можно больше инфы. Для этого надо выбрать как можно бОльший размер алфавита.
> Можно "сдвинуть" каждый байт набора символов (0-255) к > номеру символа в "координатах" алфавита (0-64):
> b[0] = b[0] mod 64; > ... > b[15] = b[15] mod 64;
> Правильно ли я понял ("... для каждой половины 8 раз берем > остаток от деления на > размер алфавита и переводим в соответствующий символ > ...")?
Нет.
Это обычное преобразование из одной системы счисления в другую. Тебе надо перевести твой GUID в 253-ричную систему счисления.
Псевдокод:
int i;
bignum GUID;
char newGUID[16];
for (i = 0; i < 16; i++) {
newGUID[i] = GUID % 253; // здесь еще надо учесть, что "дырки" находятся не в конце, а в средине алфавита
GUID /= 253;
} ---
В принципе, если нет желания возиться с большими числами, можно преобразовать по 64-битным кусочкам (64-битная арифметика встроена во все современные компиляторы).
--------------------
Я понял, что ты хотел сказать. Действительно можно обойтись только 8-битной арифметикой. Никаких остатков от деления не надо. Просто заменяй амперсанд, кавычку и знак меньше на, к примеру, 0, 1 и 2 соответственно. Все остальное - без изменений.
|