Мне нужно создать несколько двоичных файлов данных из Идентификаторов объектов, которые представляют собой двоичный двоичный буфер с переменной длиной до 64 байт и могут содержать любые байты, соответствующие непечатаемым символам. Я не могу использовать Object Identifier в качестве имени моего файла, поскольку он содержит непечатаемые буквы. Любые предложения по созданию уникального имени файла. Как можно получить или использовать UUID в этом случае?Уникальное имя файла с использованием UUID
ответ
Вы можете преобразовать байты в шестнадцатеричную строку.
#define tohex(x) ("abcdef"[(x) & 0x0f])
char buf[129];
assert(objid_len <= 64);
for (int i = 0; i < objid_len; ++i) {
buf[2*i] = tohex(objid[i] >> 4);
buf[2*i+1] = tohex(objid[i]);
}
buf[2*objid_len] = '\0';
Вы можете сделать имена файлов имеют универсальную длину с помощью символа заполнения, который находится за пределами алфавита используется для представлять идентификатор объекта. Если требуется более короткое имя файла, можно использовать более высокую базу. Например, Base64.
const char * const base64str =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/";
#define tob64(x) base64str[(x) & 0x3f]
void objid_to_filename (const unsigned char *objid, int objid_len,
char *buf) {
memset(buf, '-', 88);
buf[88] = '\0';
int i = 0, j = 0;
int buflen = 4 * ((objid_len + 2)/3);
while (i < objid_len) {
unsigned x = 0;
x |= (i < objid_len) ? objid[i++] << 16 : 0;
x |= (i < objid_len) ? objid[i++] << 8 : 0;
x |= (i < objid_len) ? objid[i++] << 0 : 0;
buf[j++] = tob64(x >> 18);
buf[j++] = tob64(x >> 12);
buf[j++] = tob64(x >> 6);
buf[j++] = tob64(x >> 0);
}
int pad = (3 - (objid_len % 3)) % 3;
for (i = 0; i < pad; ++i) buf[buflen - 1 - i] = '=';
}
И вы можете решить использовать некоторую группировку каждые 4-8 шестнадцатеричных цифр, чтобы помочь людям с именем. –
С преобразованием байтов в шестнадцатеричную строку я никогда не получу уникальное имя файла. Поскольку мой Идентификатор объекта является буфером переменной длины, но для имени файла мне нужно определить размер. Просто пример предположим 8 как размер файла, тогда в этом случае 2 отличаются ObjectId могут привести к тому же имени файла. – user503403
@ user503403: Я не понимаю вашу проблему. Идентификатор - это имя файла, а длина имени - в два раза больше длины идентификатора. Почему это не работает для вас? – jxh
см http://en.wikipedia.org/wiki/Base64 и http://stackoverflow.com/questions/342409/how-do-i-base64-encode-decode-in-c –