开发者

How do I convert this code to c++?

I have this code:

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

Unfortunately, this is some C combined with some C++. It does compile, but I don't like the printf and char*'s. I always thought this was not necessary in C++, and that there were other functions and classes to realize this. However, I don't completely understand what is going on with this:

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

And therefore I don't know how to convert it into C++. Can someone help me out with that?


sprintf returns number of bytes written. So this one writes to bptr two bytes (value of md[i] converted to %02x -> which means hex, padded on 2 chars with zeroes from left), and increases bptr by number of bytes written, so it points on string's (buf) end.

I don't get the bptr += '\0'; line, IMO it should be *bptr = '\0';

in C++ it should be written like this:

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();

EDIT: updated my c++ answer


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

This is printing the character in md[i] as 2 hex characters into the buffer and advancing the buffer pointer by 2. Thus the loop prints out the hex form of the MD5.

bptr += '\0';

That line is probably not doing what you want... its adding 0 to the pointer, giving you the same pointer back...

I'd implememt this something like this.

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 );
}


I don't know C++, so without using pointers and strings and stuff, here's a (almost) pseudo-code for you :)

    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];
    }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜