我有一个MD5字符串,我正在转换为十六进制。有一个更好的方法吗?我目前正在做的事情:
unsigned char digest[16];
string result;
char buf[32];
for (int i=0; i<16; i++)
{
sprintf_s(buf, "%02x", digest[i]);
result.append( buf );
}
答案 0 :(得分:3)
此版本应该更快。如果您需要更快的速度,请将string result
更改为char
数组。
static const char hexchars[] = "0123456789abcdef";
unsigned char digest[16];
string result;
for (int i = 0; i < 16; i++)
{
unsigned char b = digest[i];
char hex[3];
hex[0] = hexchars[b >> 4];
hex[1] = hexchars[b & 0xF];
hex[2] = 0;
result.append(hex);
}
答案 1 :(得分:1)
在这种情况下,看起来自己做转换可能比使用sprintf_s
(或类似的东西)为你做更容易。如果可能的话,我也会使用容器作为输入而不是原始数组。
std::string to_hex(std::vector<unsigned char> const &digest) {
static const char digits[] = "0123456789abcdef";
string result;
for (int i=0; i<digest.size(); i++) {
result += digits[digest[i] / 16];
result += digits[digest[i] % 16];
}
return result;
}
答案 2 :(得分:0)
或使用流:
std::string base_64_encode(const unsigned char *bytes, const size_t byte_count)
{
std::ostringstream oss;
oss << std::setfill('0') << std::hex;
for (size_t i = 0; i < byte_count; ++i)
oss << std::setw(2) << static_cast<unsigned int>(bytes[i]);
return oss.str();
}
像这样使用:
std::string encoded = base_64_encode(digest, 16);
可能不是性能最佳的解决方案。
答案 3 :(得分:-1)
unsigned char digest[16];
// (...)
string result;
for (int i = 0; i < sizeof(digest); ++i) {
result += (digest[i] >= 10) ? (digest[i] + 'a' - 10) : (digest[i] + '0');
}