2013-06-27 4 views
1

Мне нужно создать несколько двоичных файлов данных из Идентификаторов объектов, которые представляют собой двоичный двоичный буфер с переменной длиной до 64 байт и могут содержать любые байты, соответствующие непечатаемым символам. Я не могу использовать Object Identifier в качестве имени моего файла, поскольку он содержит непечатаемые буквы. Любые предложения по созданию уникального имени файла. Как можно получить или использовать UUID в этом случае?Уникальное имя файла с использованием UUID

+0

см http://en.wikipedia.org/wiki/Base64 и http://stackoverflow.com/questions/342409/how-do-i-base64-encode-decode-in-c –

ответ

3

Вы можете преобразовать байты в шестнадцатеричную строку.

#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] = '='; 
} 
+0

И вы можете решить использовать некоторую группировку каждые 4-8 шестнадцатеричных цифр, чтобы помочь людям с именем. –

+0

С преобразованием байтов в шестнадцатеричную строку я никогда не получу уникальное имя файла. Поскольку мой Идентификатор объекта является буфером переменной длины, но для имени файла мне нужно определить размер. Просто пример предположим 8 как размер файла, тогда в этом случае 2 отличаются ObjectId могут привести к тому же имени файла. – user503403

+0

@ user503403: Я не понимаю вашу проблему. Идентификатор - это имя файла, а длина имени - в два раза больше длины идентификатора. Почему это не работает для вас? – jxh