我有这段代码:
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 ++。有人可以帮我解决这个问题吗?
答案 0 :(得分:4)
sprintf
返回写入的字节数。所以这个写入bptr
两个字节(md[i]
的值转换为%02x
- &gt;这意味着十六进制,填充在2个字符上,左边是零),并增加{{1} }按字节数写入,因此它指向字符串的(bptr
)结束。
我没有得到buf
行,IMO应该是bptr += '\0';
在C ++中应该这样写:
*bptr = '\0';
编辑:更新了我的c ++答案
答案 1 :(得分:1)
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 );
}
答案 2 :(得分:0)
我不懂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];
}