C++中的十六进制转三十六进制

3

我正在尝试将16进制转换为36进制。我正在将md5哈希值转换为0-9a-z的值。

我搜索了一下,没有找到什么好的方法。有没有关于在C ++中将十六进制转换为三十六进制的建议?你们知道有什么好的库可以完成这个任务吗?


我不理解这个问题 :$ - ykatchou
在C++中,我如何将16进制数098f6bcd4621d373cade4e832627b4f6转换为36进制? - Tech163
我稍后会发布符合您要求的C++代码,但与此同时,这篇帖子可能会对您有所帮助:https://dev59.com/3HA75IYBdhLWcg3wMmGo - John Dibling
任意进制计算器(http://play.google.com/store/apps/details?id=com.ewe.radixcalculator)在Android Play市场上可以实现这一功能。它可用于在16进制和36进制之间进行转换。而且它是免费的。 - zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
2个回答

3

我猜你遇到的难点是将十六进制表示的字符串转换为Rad36,而不是获取一个整数值。因此,这里有一个函数,它接受一个 unsigned __int64,将其转换为 Radix 36,并返回一个包含转换后值的字符串。

string rad36(unsigned __int64 v)
{
    string retval;
    while( v > 0 )
    {
        unsigned m = v%36;
        if( m <= 9 )
            retval.insert(0,1,'0'+m);
        else
            retval.insert(0,1,'A'+m-10);
        v /= 36;
    }
    return retval;
}

你可能想让它返回余数,这样就可以链接调用 rad36 - Alexandre C.
谢谢。我在第一行遇到了错误:“error: expected ',' or '...' before 'v'”。我需要包含什么内容才能使用__int64吗? - Tech163
@Tech: 你在使用哪个编译器? - John Dibling
@Tech:我对GCC的经验有限,但我找到了这个链接,可能对你有用:http://ubuntuforums.org/showthread.php?t=889612 - John Dibling
仅供参考:https://dev59.com/g3I_5IYBdhLWcg3wHfKr - Zac Howland
显示剩余4条评论

3

基本解决方案是将你的128位数字转换为一个(较大的)整数,然后依次执行模数和36的除法运算。

但是,如果你可以浪费一些位,为什么不将其转换为32进制以使事情更加简单呢?这样,你就可以使用移位和屏蔽来完成所有操作。


3
另一个简单的想法是使用base64;它有几个优点:它很常见(有很多工具可以进行转换),很容易被识别,而且你可以轻松地进行转换。 - Matteo Italia
1
Base-64也非常流行(使用数字、大写和小写字母以及一些标点符号,如下划线和连字符),并且有很多函数可以进行转换。 - Ben Voigt
@John 能否解释一下? 我的印象是,Base64的主要优点之一是它实际上可以用可打印的ASCII形式表示二进制数据。 - Abe Voelker
@Abe:你是正确的,bas64确实只使用低ASCII可打印字符。我会删除我的先前评论。 - John Dibling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接