От шестнадцатеричного до шестнадцатеричного в C ++ - PullRequest
3 голосов
/ 29 декабря 2010

Я пытаюсь преобразовать базу 16 в базу 36. Я беру md5 хэши и заставляю их иметь все 0-9a-z.

Я искал вокруг и не нашел ничего хорошего. Любые предложения для преобразования шестнадцатеричного в шестнадцатеричный в C ++? Ребята, вы знаете какие-нибудь хорошие библиотеки для этого?

Ответы [ 2 ]

3 голосов
/ 29 декабря 2010

Я предполагаю, что самая сложная часть, с которой вы боретесь, - это преобразование в Rad36, а не получение целого значения из шестнадцатеричного числа, представленного в виде строки. Итак, вот функция, которая принимает unsigned __int64, преобразует его в Radix 36 и возвращает строку с преобразованным значением.

string rad36(unsigned __int64 v)
{
    string retval;
    while( v > 0 )
    {
        unsigned m = v%36;
        if( m <= 9 )
            retval.insert(0,1,'0'+m);
        else
            retval.insert(0,1,'A'+m-10);
        v /= 36;
    }
    return retval;
}
3 голосов
/ 29 декабря 2010

Основное решение - преобразовать 128-битное число в (большое) целое число, а затем выполнить операции модуля и деления на 36.

Однако, если вы согласны тратить пару битов, почему бы не перейти на базу 32, чтобы упростить процесс? Тогда вы можете делать все со смещением и маскировкой.

...