C++如何将十六进制字符串转换为二进制字符串

 更新时间:2023年08月02日 08:35:59   作者:花好约猿上王者  
这篇文章主要介绍了C++如何将十六进制字符串转换为二进制字符串问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

十六进制字符串转换为二进制字符串

一种简单的方法将十六进制字符串转为二进制字符串,不限制十六进制的字节数。

源代码

传入的十六进制字符串需要转换为大写!(%X, toupper())。

string GetBinaryStringFromHexString (string strHex)
{
    string sReturn = "";
    unsigned int len = strHex.length();
    for (unsigned int i = 0; i<len; i++)
    {
        switch ( strHex[i])
        {
            case '0': sReturn.append ("0000"); break;
            case '1': sReturn.append ("0001"); break;
            case '2': sReturn.append ("0010"); break;
            case '3': sReturn.append ("0011"); break;
            case '4': sReturn.append ("0100"); break;
            case '5': sReturn.append ("0101"); break;
            case '6': sReturn.append ("0110"); break;
            case '7': sReturn.append ("0111"); break;
            case '8': sReturn.append ("1000"); break;
            case '9': sReturn.append ("1001"); break;
            case 'A': sReturn.append ("1010"); break;
            case 'B': sReturn.append ("1011"); break;
            case 'C': sReturn.append ("1100"); break;
            case 'D': sReturn.append ("1101"); break;
            case 'E': sReturn.append ("1110"); break;
            case 'F': sReturn.append ("1111"); break;
        }
    }
    return sReturn;
}

十六进制字符串转二进制字符串1的个数

优化版

建立十六进制字符串 字符“0-F” 对应二进制中1的个数的映射数组

代码如下:

#include<iostream>
#include<string>
using namespace std;
int main(){
    string inputHex;
    cin >> inputHex;
    int bitOneNumber[16] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
    inputHex = inputHex.substr(2);
    int cnt = 0;
    for(auto ch : inputHex){
        if(ch >= '0' && ch <= '9')
            cnt += bitOneNumber[ch - '0'];
        else if(ch >= 'a' && ch <= 'f')
            cnt += bitOneNumber[ch - 'a' + 10];
        else
            return -1;
    }
    cout << cnt <<  endl;
    system("pause");
    return 0;
}

十六进制字符串转为二进制字符串

遍历统计1的个数

#include<iostream>
#include<string>
using namespace std;
string HexStrToBinStr(string& inputHex){
    string binStr;
    for(auto ch : inputHex){
        switch (ch)
        {
        case '0' : binStr += "0000"; break;
        case '1' : binStr += "0001"; break;
        case '2' : binStr += "0010"; break;
        case '3' : binStr += "0011"; break;
        case '4' : binStr += "0100"; break;
        case '5' : binStr += "0101"; break;
        case '6' : binStr += "0110"; break;
        case '7' : binStr += "0111"; break;
        case '8' : binStr += "1000"; break;
        case '9' : binStr += "1001"; break;
        case 'a' : binStr += "1010"; break;
        case 'b' : binStr += "1011"; break;
        case 'c' : binStr += "1100"; break;
        case 'd' : binStr += "1101"; break;
        case 'e' : binStr += "1110"; break;
        case 'f' : binStr += "1111"; break;
        default:
            break;
        }
    }
    return binStr;
}
int main(){
    string inputHex;
    cin >> inputHex;
    inputHex = inputHex.substr(2);
    string binStr = HexStrToBinStr(inputHex);
    int cnt = 0;
    for(auto ch : binStr)
        if(ch == '1')
            ++cnt;
    cout << cnt << endl;
    cout << binStr << endl;
    system("pause");
    return 0;
}

二进制字符串转十进制字符串

#include<iostream>
#include<string>
using namespace std;
//十六进制字符串串转二进制
string HexStrToBinStr(string& inputHex){
    string binStr;
    for(auto ch : inputHex){
        switch (ch)
        {
        case '0' : binStr += "0000"; break;
        case '1' : binStr += "0001"; break;
        case '2' : binStr += "0010"; break;
        case '3' : binStr += "0011"; break;
        case '4' : binStr += "0100"; break;
        case '5' : binStr += "0101"; break;
        case '6' : binStr += "0110"; break;
        case '7' : binStr += "0111"; break;
        case '8' : binStr += "1000"; break;
        case '9' : binStr += "1001"; break;
        case 'a' : binStr += "1010"; break;
        case 'b' : binStr += "1011"; break;
        case 'c' : binStr += "1100"; break;
        case 'd' : binStr += "1101"; break;
        case 'e' : binStr += "1110"; break;
        case 'f' : binStr += "1111"; break;
        default:
            break;
        }
    }
    return binStr;
}
//二进制转十进制
struct decStr{
    int len;
    char decstr[100000];
    decStr() : len(0){
        for(int i = 0; i < 100000; ++i)
            decstr[i] = 0;
    }
};
void addCurNumToDecStr(decStr& data, int num){
    for(int i = 0; i < data.len; ++i)
        data.decstr[i] *= 2;
    data.decstr[0] += num;
    for(int i = 0; i < data.len; ++i){
        data.decstr[i + 1] += data.decstr[i] / 10;
        data.decstr[i] %= 10;
    }
    if(data.decstr[data.len] != 0) ++data.len;
}
string assicTostr(decStr&data){
    string decstr;
    for(int i = data.len - 1; i >= 0; --i){
        decstr += data.decstr[i] + '0';
    }
    return decstr;
}
string BinStrToDecStr(string& binStr){
    decStr data;
    for(int i = 0; i < binStr.size(); ++i){
        addCurNumToDecStr(data, binStr[i] == '1' ? 1 : 0);    
    }
    string decstr = assicTostr(data);
    return decstr;
}
int main(){
    string inputHex;
    cin >> inputHex;
    inputHex = inputHex.substr(2);
    string binStr = HexStrToBinStr(inputHex);
    int cnt = 0;
    for(auto ch : binStr)
        if(ch == '1')
            ++cnt;
    cout << cnt << endl;
    cout << binStr << endl;
    string decstr = BinStrToDecStr(binStr);
    cout << decstr << endl;
    system("pause");
    return 0;
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解C语言和Python中的线程混用

    详解C语言和Python中的线程混用

    这篇文章主要介绍了C和Python中的线程混用的相关资料,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • C语言数字图像处理之直方图均衡化

    C语言数字图像处理之直方图均衡化

    这篇文章主要为大家详细介绍了C语言数字图像处理之直方图均衡化,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • C++设计模式之职责链模式

    C++设计模式之职责链模式

    这篇文章主要介绍了C++设计模式之职责链模式,本文讲解了什么是职责链模式、什么场合下使用、代码实例等内容,需要的朋友可以参考下
    2014-10-10
  • c++优先队列用法知识点总结

    c++优先队列用法知识点总结

    在本篇文章里小编给大家整理的是关于c++优先队列用法知识点总结内容,需要的朋友可以参考学习下。
    2020-02-02
  • C语言实现简单的贪吃蛇游戏

    C语言实现简单的贪吃蛇游戏

    这篇文章主要为大家详细介绍了C语言实现简单的贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C++基础学习之函数重载的简单介绍

    C++基础学习之函数重载的简单介绍

    函数重载是一种特殊情况,C++允许在同一作用域中声明几个类似的同名函数,这些同名函数的形参列表(参数个数,类型,顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。这篇文章主要给大家介绍了关于C++基础学习之函数重载的相关资料,需要的朋友可以参考下
    2019-01-01
  • Ubuntu 20.04 下安装配置 VScode 的 C/C++ 开发环境(图文教程)

    Ubuntu 20.04 下安装配置 VScode 的 C/C++ 开发环境(图文教程)

    这篇文章主要介绍了Ubuntu 20.04 下安装配置 VScode 的 C/C++ 开发环境,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • C语言初阶之数组详细介绍

    C语言初阶之数组详细介绍

    大家好,本篇文章主要讲的是C语言初阶之数组详细介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • C语言数据结构创建及遍历十字链表

    C语言数据结构创建及遍历十字链表

    这篇文章主要介绍了C语言数据结构十字链表的创建及遍历,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-10-10
  • 融会贯通C++智能指针教程

    融会贯通C++智能指针教程

    本文主要介绍了c++的基础知识,通过不带引用计数的只能指针和带引用的智能指针,shared_ptr和weak_ptr,多线程访问共享对象的线程安全问题以及自定义删除器作了详细的分析解答
    2021-08-08

最新评论