Посмотрим. 128 / log2 (62) = 21,497. Это означает, что вам нужно 22 "цифры" для представления base-62.
Если вас просто интересует строковое представление, которое не длиннее 22 символов и не использует более 62 различных символов, вам не нужно реальное представление base-62. Вы можете разбить 128 бит на более мелкие части и кодировать части по отдельности. Таким образом, вам не понадобится 128-битная арифметика. Вы можете разделить 128 бит на 2x64 бит и закодировать каждый 64-битный блок строкой длиной 11. Это возможно даже с 57 различными символами. Таким образом, вы можете исключить 5 из 62 символов, чтобы избежать «визуальной неоднозначности». Например, удалить l, 1, B, 8. Это оставляет 58 различных символов и 11 * log2 (58) = 64,438, что достаточно для кодирования 64 бит.
Получить два 64-битных блока не так сложно:
#include <climits>
#if CHAR_BIT != 8
#error "platform not supported, CHAR_BIT==8 expected"
#endif
// 'long long' is not yet part of C++
// But it's usually a supported extension
typedef unsigned long long uint64;
uint64 bits2uint64_bigendian(unsigned char const buff[]) {
return (static_cast<uint64>(buff[0]) << 56)
| (static_cast<uint64>(buff[1]) << 48)
| (static_cast<uint64>(buff[2]) << 40)
| (static_cast<uint64>(buff[3]) << 32)
| (static_cast<uint64>(buff[4]) << 24)
| (static_cast<uint64>(buff[5]) << 16)
| (static_cast<uint64>(buff[6]) << 8)
| static_cast<uint64>(buff[7]);
}
int main() {
unsigned char md5sum[16] = {...};
uint64 hi = bits2uint64_bigendian(md5sum);
uint64 lo = bits2uint64_bigendian(md5sum+8);
}