C语言中的base32转换

新手上路,请多包涵

有人知道任何常用的 C++ 库,它提供了从基数 10 到基数 32 编码和解码数字的方法,反之亦然?

谢谢,斯特凡诺

原文由 Spac 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

您的意思是“base 10 to base 32”,而不是 整数到 base32 吗?后者似乎更有可能和更有用;默认情况下,标准格式的 I/O 函数在处理整数时会生成以 10 为基数的字符串格式。

对于基数 32 到整数的转换,标准库 strtol() 函数将执行此操作。对于互惠,您不需要库来轻松实现自己的东西(并非所有东西都是乐高积木)。

这是一个例子,不一定是最有效的,但很简单;

 #include <cstring>
#include <string>

long b32tol( std::string b32 )
{
    return strtol( b32.c_str(), 0, 32 ) ;
}

std::string itob32( long i )
{
    unsigned long u = *(reinterpret_cast<unsigned long*>)( &i ) ;
    std::string b32 ;

    do
    {
        int d = u % 32 ;
        if( d < 10 )
        {
            b32.insert( 0, 1, '0' + d ) ;
        }
        else
        {
            b32.insert( 0, 1, 'a' + d - 10 ) ;
        }

        u /= 32 ;

    } while( u > 0 );

    return b32 ;
}

#include <iostream>

int main()
{
    long i = 32*32*11 + 32*20 + 5 ; // BK5 in base 32
    std::string b32 = itob32( i ) ;
    long ii = b32tol( b32 ) ;

    std::cout << i << std::endl ;    // Original
    std::cout << b32 << std::endl ;  // Converted to b32
    std::cout << ii << std::endl ;   // Converted back

    return 0 ;
}

原文由 Clifford 发布,翻译遵循 CC BY-SA 2.5 许可协议

[更新] 显然,C++ std::setbase() IO 操作符和普通 <<>> IO 操作符只处理基数 8、10 和 16,因此对处理没有用基数 32。

所以要解决你的转换问题

  • 1032 为基数表示从某些输入读取到程序中的整数的数字的字符串
  • 将程序中的整数转换为以 1032 为基数的字符串以输出

您将需要求助于其他功能。

要将包含基本 2..36 表示的 C 样式字符串转换为整数,您可以使用 #include <cstdlib> 并使用 strtol(3) & Co. 函数集。

至于将整数转换为具有任意基数的字符串……我找不到一个简单的答案。 printf(3) 样式格式字符串仅处理基数 8,10,16 AFAICS,就像 std::setbase 。任何人?

原文由 ndim 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏