C++实现二进制字符串与十六进制字符串相互转换

 更新时间:2025年11月24日 09:22:35   作者:熊猫_豆豆  
这篇文章主要为大家详细介绍了如何使用C++实现二进制字符串与十六进制字符串相互转换,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

以下是一个将二进制字符串转换为十六进制字符串的C++函数:

#include <string>
#include <unordered_map>

std::string binaryToHex(const std::string& binaryStr) {
    // 预定义的二进制到十六进制映射
    std::unordered_map<std::string, char> binToHex = {
        {"0000", '0'}, {"0001", '1'}, {"0010", '2'}, {"0011", '3'},
        {"0100", '4'}, {"0101", '5'}, {"0110", '6'}, {"0111", '7'},
        {"1000", '8'}, {"1001", '9'}, {"1010", 'A'}, {"1011", 'B'},
        {"1100", 'C'}, {"1101", 'D'}, {"1110", 'E'}, {"1111", 'F'}
    };
    
    std::string result;
    std::string paddedBinary = binaryStr;
    
    // 在二进制字符串前面补0,使其长度成为4的倍数
    int remainder = paddedBinary.length() % 4;
    if (remainder != 0) {
        paddedBinary = std::string(4 - remainder, '0') + paddedBinary;
    }
    
    // 每4位一组进行转换
    for (size_t i = 0; i < paddedBinary.length(); i += 4) {
        std::string group = paddedBinary.substr(i, 4);
        result += binToHex[group];
    }
    
    return result;
}

使用示例:

#include <iostream>

int main() {
    std::string binary1 = "1101";           // 二进制 1101
    std::string binary2 = "101011";         // 二进制 101011
    std::string binary3 = "111100001010";   // 二进制 111100001010
    
    std::cout << binary1 << " -> " << binaryToHex(binary1) << std::endl;  // 输出: D
    std::cout << binary2 << " -> " << binaryToHex(binary2) << std::endl;  // 输出: 2B
    std::cout << binary3 << " -> " << binaryToHex(binary3) << std::endl;  // 输出: F0A
    
    return 0;
}

如果你想要一个更简洁的版本,也可以使用位运算的方法:

#include <string>
#include <sstream>

std::string binaryToHexBitwise(const std::string& binaryStr) {
    // 先将二进制字符串转换为整数
    unsigned long long decimal = 0;
    for (char c : binaryStr) {
        decimal = (decimal << 1) | (c - '0');
    }
    
    // 再将整数转换为十六进制字符串
    std::stringstream ss;
    ss << std::hex << std::uppercase << decimal;
    
    return ss.str();
}

注意事项:

  • 第一个方法使用查表法,适合处理任意长度的二进制字符串
  • 第二个方法使用位运算,更简洁但可能受限于整数类型的最大长度
  • 两个函数都会自动处理前导零的情况
  • 输出使用大写字母(A-F),如果需要小写字母,可以将映射中的字母改为小写

选择哪种方法取决于你的具体需求:

  • 如果需要处理很长的二进制字符串,建议使用第一种方法
  • 如果二进制字符串长度在64位以内,第二种方法更简洁高效

以下是一个将十六进制字符串转换为二进制字符串的C++函数:

#include <string>
#include <unordered_map>

std::string hexToBinary(const std::string& hexStr) {
    // 预定义的十六进制到二进制映射
    std::unordered_map<char, std::string> hexToBin = {
        {'0', "0000"}, {'1', "0001"}, {'2', "0010"}, {'3', "0011"},
        {'4', "0100"}, {'5', "0101"}, {'6', "0110"}, {'7', "0111"},
        {'8', "1000"}, {'9', "1001"}, {'A', "1010"}, {'B', "1011"},
        {'C', "1100"}, {'D', "1101"}, {'E', "1110"}, {'F', "1111"},
        {'a', "1010"}, {'b', "1011"}, {'c', "1100"}, {'d', "1101"},
        {'e', "1110"}, {'f', "1111"}
    };
    
    std::string result;
    
    for (char c : hexStr) {
        // 跳过空格等无关字符
        if (c == ' ' || c == '\t' || c == '\n') {
            continue;
        }
        
        // 检查是否为有效的十六进制字符
        if (hexToBin.find(c) != hexToBin.end()) {
            result += hexToBin[c];
        } else {
            // 如果遇到无效字符,可以抛出异常或返回空字符串
            throw std::invalid_argument("Invalid hexadecimal character: " + std::string(1, c));
            // 或者返回空字符串:return "";
        }
    }
    
    // 移除前导零(可选)
    size_t firstOne = result.find_first_not_of('0');
    if (firstOne != std::string::npos) {
        result = result.substr(firstOne);
    } else {
        // 如果全是零,返回"0"
        result = "0";
    }
    
    return result;
}

使用示例:

#include <iostream>
#include <stdexcept>

int main() {
    try {
        std::string hex1 = "D";      // 十六进制 D
        std::string hex2 = "2B";     // 十六进制 2B
        std::string hex3 = "F0A";    // 十六进制 F0A
        std::string hex4 = "1F";     // 十六进制 1F
        
        std::cout << hex1 << " -> " << hexToBinary(hex1) << std::endl;  // 输出: 1101
        std::cout << hex2 << " -> " << hexToBinary(hex2) << std::endl;  // 输出: 101011
        std::cout << hex3 << " -> " << hexToBinary(hex3) << std::endl;  // 输出: 111100001010
        std::cout << hex4 << " -> " << hexToBinary(hex4) << std::endl;  // 输出: 11111
        
        // 测试小写字母
        std::cout << "a" << " -> " << hexToBinary("a") << std::endl;    // 输出: 1010
        
    } catch (const std::exception& e) {
        std::cout << "Error: " << e.what() << std::endl;
    }
    
    return 0;
}

如果你想要一个不使用异常处理的版本:

#include <string>
#include <unordered_map>

std::string hexToBinarySafe(const std::string& hexStr) {
    std::unordered_map<char, std::string> hexToBin = {
        {'0', "0000"}, {'1', "0001"}, {'2', "0010"}, {'3', "0011"},
        {'4', "0100"}, {'5', "0101"}, {'6', "0110"}, {'7', "0111"},
        {'8', "1000"}, {'9', "1001"}, {'A', "1010"}, {'B', "1011"},
        {'C', "1100"}, {'D', "1101"}, {'E', "1110"}, {'F', "1111"},
        {'a', "1010"}, {'b', "1011"}, {'c', "1100"}, {'d', "1101"},
        {'e', "1110"}, {'f', "1111"}
    };
    
    std::string result;
    
    for (char c : hexStr) {
        if (c == ' ' || c == '\t' || c == '\n') {
            continue;
        }
        
        auto it = hexToBin.find(c);
        if (it != hexToBin.end()) {
            result += it->second;
        } else {
            // 遇到无效字符时返回空字符串
            return "";
        }
    }
    
    // 处理全零的情况
    if (result.empty()) {
        return "0";
    }
    
    // 移除前导零
    size_t firstOne = result.find_first_not_of('0');
    if (firstOne != std::string::npos) {
        result = result.substr(firstOne);
    } else {
        result = "0";
    }
    
    return result;
}

函数特点:

  • 大小写支持:同时支持大写和小写十六进制字符
  • 空格处理:自动跳过空格、制表符和换行符
  • 错误处理:提供异常处理和安全返回两种方式
  • 前导零处理:可选是否移除前导零
  • 完整性:每个十六进制字符转换为4位二进制

注意事项:

  • 如果需要保留前导零,可以注释掉移除前导零的代码部分
  • 可以根据需要调整错误处理策略(抛出异常或返回特定值)
  • 函数会验证输入的有效性,确保只处理合法的十六进制字符

到此这篇关于C++实现二进制字符串与十六进制字符串相互转换的文章就介绍到这了,更多相关C++进制字符串转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Prim(普里姆)算法求最小生成树的思想及C语言实例讲解

    Prim(普里姆)算法求最小生成树的思想及C语言实例讲解

    Prim算法能够在带权的图中搜索出最小生成树,这也是各大ACM和面试及考研题目中的热点,下面我们就来详细看一下Prim(普里姆)算法求最小生成树的思想及C语言实例讲解
    2016-06-06
  • C++获取GPU显卡信息的示例代码

    C++获取GPU显卡信息的示例代码

    这篇文章主要为大家详细介绍了如何使用C++获取GPU显卡信息,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下
    2024-02-02
  • C语言深入浅出解析二叉树

    C语言深入浅出解析二叉树

    二叉树可以简单理解为对于一个节点来说,最多拥有一个上级节点,同时最多具备左右两个下级节点的数据结构。本文将详细介绍一下C++中二叉树的实现和遍历,需要的可以参考一下
    2022-03-03
  • C++类成员指针的实现示例

    C++类成员指针的实现示例

    类成员指针是指向类成员的特殊指针,与普通指针不同,它存储的是成员在类中的偏移量,而非直接内存地址,下面就来介绍一下C++类成员指针的使用,感兴趣的可以了解一下
    2026-02-02
  • C语言实现strlen的三种方法小结

    C语言实现strlen的三种方法小结

    本文主要介绍了C语言实现strlen的三种方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • C语言中结构体、联合体的成员内存对齐情况

    C语言中结构体、联合体的成员内存对齐情况

    这篇文章主要给大家介绍了关于C语言中结构体、联合体的成员内存对齐情况的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • C++ ASIO实现异步套接字管理详解

    C++ ASIO实现异步套接字管理详解

    Boost ASIO(Asynchronous I/O)是一个用于异步I/O操作的C++库,该框架提供了一种方便的方式来处理网络通信、多线程编程和异步操作,本文介绍了如何通过ASIO框架实现一个简单的异步网络套接字应用程序,需要的可以参考下
    2023-08-08
  • C++读取INI配置文件类实例详解

    C++读取INI配置文件类实例详解

    这篇文章主要介绍了C++读取INI配置文件类的实现方法,需要的朋友可以参考下
    2014-07-07
  • C++和python实现单链表及其原理

    C++和python实现单链表及其原理

    这篇文章主要介绍了C++和python实现单链表及其原理,单链表是链表家族中的一员,每个节点依旧由数据域(data)和指针域(next)组成,链表的具体概念下面文章将详细介绍,需要的小伙伴可以参考一下
    2022-03-03
  • DSP中浮点转定点运算--举例及编程中的心得

    DSP中浮点转定点运算--举例及编程中的心得

    本文主要讲解DSP浮点转定点运算举例及编程中的心得 ,具有参考价值,需要的朋友可以参考一下。
    2016-06-06

最新评论