【发布时间】:2010-09-14 07:46:38
【问题描述】:
我有这个代码:
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++。有人可以帮我解决这个问题吗?
【问题讨论】:
-
这里潜伏着一个非常危险的“off-by-one”错误。
buf的大小应为MD5_DIGEST_LENGTH + MD5_DIGEST_LENGTH + 1以说明 sprintf 插入的终止 NUL。我不知道这与 C++ 有何对应关系。 -
请注意,
*bptr += '\0';将插入相同的尾随\0。当前语句bptr += '\0';也是无操作的。真的,这是一行中的两个错误。