Hex string convert to Binary String and Vise-Versa(16进制和2进制字符串的相互转换)

这个转换在我们日常的编码中还是很有机会遇到的,这里贴出来和大家分享探讨。

void pu_hex_to_binary(std::string strHex, std::string &strBinaryResult)
{
    for ( int i = 0; i < strHex.size(); ++ i )  {
        char chTemp = strHex[i];
        int chHexValue;
        if ( 'F' >= chTemp && chTemp >= 'A' )
            chHexValue = chTemp - 'A' + 10;
        else if ( 'f' >= chTemp && chTemp >= 'a' )
            chHexValue = chTemp - 'a' + 10;
        else
            chHexValue = chTemp - '0';

        std::string strBinary;
        char iBit = 4;
        while( iBit > 0 ) {
            if ( chHexValue % 2 == 0 )
                strBinary.push_back('0');
            else
                strBinary.push_back('1');
            if ( chHexValue > 0 )
                chHexValue >>= 1;
            -- iBit;
        }
        std::reverse(strBinary.begin(), strBinary.end());
        strBinaryResult.append( strBinary );
    }
}

void pu_binary_to_hex(std::string strBinary, std::string &strHex )
{
    int chHexValue = 0;
    strHex.clear();
    for ( int i = 0; i < strBinary.size(); )  {
        std::string strSubBinary;
        if (strBinary.size() - i >= 4)    {
            strSubBinary = strBinary.substr(i, 4);
            i += 4;
        }
        else
        {
            strSubBinary = strBinary.substr(i);
            i = strBinary.size();
        }
        std::reverse(strSubBinary.begin(), strSubBinary.end());

        chHexValue = 0;
        for (int j = 0; j < strSubBinary.size(); ++j)    {
            char chTemp = strSubBinary [ j ];
            char chBinaryValue = chTemp - '0';

            if (chBinaryValue % 2 == 1)
                chHexValue += 1 << j;   

        }
        if (chHexValue < 10)
            strHex.push_back(chHexValue + '0');
        else
            strHex.push_back(chHexValue - 10 + 'A');
    }
}

  

原文地址:https://www.cnblogs.com/shengguang/p/5474791.html