5

私は 16 進数に変換している 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 );
}
4

4 に答える 4

5

このバージョンはより高速である必要があります。さらに速度が必要な場合は、アレイに変更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);
}
于 2013-05-30T04:20:23.897 に答える
2

この場合、自分で変換を行う方が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;
}
于 2013-05-30T04:20:32.193 に答える
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);

ただし、おそらく最もパフォーマンスの高いソリューションではありません。

于 2013-05-30T05:32:31.960 に答える
-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');
}
于 2013-05-30T04:24:54.333 に答える