Как мне преобразовать этот код в C ++? - PullRequest
0 голосов
/ 14 сентября 2010

У меня есть этот код:

    string get_md5sum(unsigned char* md) {
        char buf[MD5_DIGEST_LENGTH + MD5_DIGEST_LENGTH];
        char *bptr;
        bptr = buf;
        for(int i = 0; i < MD5_DIGEST_LENGTH; i++) {
                bptr += sprintf(bptr, "%02x", md[i]);
        }
        bptr += '\0';
        string x(buf);
        return x;
}

К сожалению, это немного C в сочетании с некоторым C ++.Он компилируется, но мне не нравятся printf и char *.Я всегда думал, что в C ++ это не нужно, и что для этого есть другие функции и классы.Однако я не совсем понимаю, что происходит с этим:

 bptr += sprintf(bptr, "%02x", md[i]);

И поэтому я не знаю, как преобразовать его в C ++.Может ли кто-нибудь помочь мне с этим?

Ответы [ 3 ]

4 голосов
/ 14 сентября 2010

sprintf возвращает количество записанных байтов. Таким образом, этот записывает в bptr два байта (значение md[i], преобразованное в %02x ->, что означает шестнадцатеричное число, дополненное двумя символами с нулями слева), и увеличивает bptr на количество записанных байтов, поэтому указывает на конец строки (buf).

Я не получаю строку bptr += '\0';, IMO это должно быть *bptr = '\0';

в C ++ это должно быть написано так:

using namespace std;
stringstream buf;
for(int i = 0; i < MD5_DIGEST_LENGTH; i++)
{
    buf << hex << setfill('0') << setw(2) << static_cast<int>(static_cast<unsigned char>(md[i])); 
}
return buf.str();

РЕДАКТИРОВАТЬ: обновил мой ответ C ++

1 голос
/ 14 сентября 2010
bptr += sprintf(bptr, "%02x", md[i]);

Это печать символа в md [i] как 2 шестнадцатеричных символа в буфер и продвижение указателя буфера на 2. Таким образом, цикл выводит шестнадцатеричную форму MD5.

bptr+ = '\ 0';

Эта строка, вероятно, не делает то, что вы хотите ... она добавляет 0 к указателю, возвращая вам тот же указатель ...

Я быреализовать это примерно так.

string get_md5sum(unsigned char* md) {
        static const char[] hexdigits="0123456789ABCDEF";
        char buf[ 2*MD5_DIGEST_LENGTH ];
        for(int i = 0; i < MD5_DIGEST_LENGTH; i++) {
                bptr[2*i+0] = hexdigits[ md[i] / 16 ];
                bptr[2*i+1] = hexdigits[ md[i] % 16 ];
        }
        return string(buf,2*MD5_DIGEST_LENGTH );
}
0 голосов
/ 14 сентября 2010

Я не знаю C ++, поэтому без использования указателей, строк и прочего вот (почти) псевдокод для вас:)

    for(int i = 0; i < MD5_DIGEST_LENGTH; i++) {
            buf[i*2] = hexdigits[(md[i] & 0xF0) >> 4];
            buf[i*2 + 1] = hexdigits[md[i] & 0x0F];
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...